如果数组中存在一组特定的数字,我该如何计算

时间:2016-04-09 07:30:59

标签: java algorithm java-8

假设我有一个数字123.我需要查看是否得到所有数字1到9,包括0.数字123有三位数:1,2和3.然后我乘以2得到246(我得到数字2,4,6)。然后我乘以3得到369.我继续进行增量乘法,直到得到所有数字。

我的方法如下:

public int digitProcessSystem(int N) {
 String number = Integer.toString(N);
 String [] arr = number.split("");
// List <Integer> arr2 = new ArrayList<>();
 for (Integer i = 0; i < arr.length; i++) {
     try {

         arr2[i] = Integer.parseInt(arr[i]);
     } catch (NumberFormatException e) {
         }
     }

 count =0;
 boolean contains = IntStream.of(arr2).anyMatch(x -> x == 1|| x==2 ||x ==  3|| x==4|| x == 5|| x==6 ||x == 7|| x==8||x == 9|| x==0);

}

我真的不知道如何继续为上面第一条路径中不匹配的数字做布尔值,因为我肯定会得到上述布尔搜索中所有数字中的任何一个。如果某些特定数字存在且有些不是这样我可以将实际数字乘以搜索第一次试验中未找到的数字,我该如何得到;就像我在开始时定义的方式一样。

3 个答案:

答案 0 :(得分:3)

您可以将其包装到while循环中,并将数字包含在Set中。一旦集合的大小为10,则数字中将出现所有数字。我还建议使用long而不是int,否则你会得到错误的结果或遇到一个问题。以下是一些示例代码:

private static long digitProcessSystem(long N) {
    long numberN = N;
    String number = Long.toString(N);
    // calculate 10 digits number here yet
    if (number.length() < 10) {
        // using the smallest possible number with each digit
        // By using this number we are most likely allmost at the result
        // This will increase the performance for small digits heavily.
        long divider = 1023456789L / numberN;
        numberN *= divider;
    }
    number = Long.toString(numberN);
    String[] arr = number.split("");
    Set<String> input = new HashSet<>(Arrays.asList(arr));
    while(input.size() != 10){
        // add N to number
        numberN += N;
        // Parse the new number
        number = Long.toString(numberN);
        // split
        arr = number.split("");
        // clear set
        input.clear();
        // Add the new numbers to the set. If it has the size 10 now the loop will stop and return the number.
        input.addAll(Arrays.asList(arr));
    };
    return numberN;
}

public static void main(String[] args) {
    System.out.println(digitProcessSystem(123));
}

输出:

1023458769

答案 1 :(得分:3)

我不确定你的最终目标是什么。但你可以使用HashSet并做这样的事情来实现你想要实现的目标:

public static void main (String[] args) throws Exception {
    long number = 123L, counter = 1000000000L / number;
    while(digitProcessSystem(number * counter++));
    System.out.println("Number: " + number * (counter - 1));
}

public static boolean digitProcessSystem(long input) {
    char[] arr = Long.toString(input).toCharArray();
    Set<Character> set = new HashSet<>();
    for (int i = 0; i < arr.length; i++) {
        set.add(arr[i]);
    }
    return set.size() != 10;
}

输出:

Number: 1023458769

答案 2 :(得分:2)

不使用java语言设施和hashset:

private static long digitProcessSystem(long N) {
long numberN = N;
String number = Long.toString(N);
String[] arr = number.split("");;
int arr2=new int[10];
int sum=0;
while(sum != 10){
    sum=0;
    // add N to number
    numberN += N;
    // Parse the new number
    number = Long.toString(numberN);
    // If it doesn´t have 10 digitis continue here yet
    if(number.length() < 10) continue;
    // split
    arr = number.split("");
    for(int i=0;i<arr.length;i++){
        arr2[arr]=1;
    }
    for(int i=0;i<10;i++){
        sum+=arr2[i];
    }
};
return numberN;
}