找出符合条件的数字【非LeetCode】

2019-06-16  本文已影响0人  比轩

无意间看到的这道题,其实题很简单,应该算是高中的逻辑推理题,贴这道题的意义在于,如何用代码表达抽象的逻辑

image.png

正常推理应该是这样的:

用代码其实相当简化了,直接000-999遍历,同时满足1,2,3,4条件的数字最后就是正确答案。实现的具体思路就是,将1,2,3,4个条件转化为filter,对数字进行过滤就OK,这里提供一个java实现:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.IntStream;

/**
 * KeyNumbers
 *
 * @author huifei.liu@hand-chian.com
 * Date: 2019-06-16
 * Description: 找出符合条件的数字
 */

public class KeyNumbers {

    private static int[] condition1 = {6,8,2};
    private static int[] condition2 = {6,1,4};
    private static int[] condition3 = {2,0,6};
    private static int[] condition4 = {7,3,8};
    private static int[] condition5 = {8,7,0};

    public static void main(String[] args) {

        Function<Integer, int[]> split = num -> String.format("%03d", num)
                .chars().map(i -> i - '0').toArray();
        IntStream.range(0, 999)
                .boxed()
                .map(split)
                .filter(KeyNumbers::condition1)
                .filter(KeyNumbers::condition2)
                .filter(KeyNumbers::condition3)
                .filter(KeyNumbers::condition4)
//                .filter(KeyNumbers::condition5)
                .findAny()
                .map(Arrays::toString)
                .ifPresent(System.out::println); // [0,4,2]

    }



    /**
     * 6-8-2: 一个号码正确,且位置正确
     */
    public static boolean condition1(int[] numbers) {
        int[] arr = contains(condition1, numbers);
        if (arr.length != 1) {
            return false;
        }
        int num = arr[0], index = indexOf(numbers, arr[0]);
        // test condition 1
        return num == KeyNumbers.condition1[index]
                && num == numbers[index];
    }

    /**
     * 6-1-4: 一个号码正确, 但是位置不正确
     */
    public static boolean condition2(int[] numbers) {
        int[] arr = contains(condition2, numbers);
        if (arr.length != 1) {
            return false;
        }
        int num = arr[0], index = indexOf(numbers, arr[0]);
        return index != indexOf(condition2, num);
    }

    /**
     * 2-0-6: 两个号码正确,位置不正确
     */
    public static boolean condition3(int[] numbers) {
        int[] arr = contains(condition3, numbers);
        if (arr.length != 2) {
            return false;
        }
        int num1 = arr[0], index1 = indexOf(numbers, arr[0]);
        int num2 = arr[1], index2 = indexOf(numbers, arr[1]);
        return index1 != indexOf(KeyNumbers.condition3, num1)
                && index2 != indexOf(KeyNumbers.condition3, num2);
    }

    /**
     * 7-3-8: 都不正确
     */
    public static boolean condition4(int[] numbers) {
        int[] arr = contains(condition4, numbers);
        return arr.length == 0;
    }

    /**
     * 8-7-0: 一个号码正确,但是位置不正确
     */
    public static boolean condition5(int[] numbers) {
        int[] arr = contains(condition5, numbers);
        if (arr.length != 1) {
            return false;
        }
        int num = arr[0], index = indexOf(numbers, arr[0]);
        return index != indexOf(KeyNumbers.condition5, num);
    }

    public static int[] contains(int[] array, int ...number) {
        List<Integer> result = new ArrayList<>();
        for (int a : array) {
            for (int b : number) {
                if (a == b) {
                    result.add(a);
                }
            }
        }
        int[] arr = new int[result.size()];
        int count = 0;
        for (int num : result) {
            arr[count] = num;
            count++;
        }
        return arr;

    }

    public static int indexOf(int[] arr, int num) {
        for(int i = 0; i < arr.length; i++) {
            if (num == arr[i]) {
                return i;
            }
        }
        return -1;
    }
}


上一篇 下一篇

猜你喜欢

热点阅读