2014-10-08 114 views
-5

我有一个整数数组列表。它将始终包含5个整数。现在假设它包含数字10031.现在我想在元素中进行这种计算。如何用数组列表元素进行计算。

添加此数字中的数字,直到您留下1或2位数字。

1 ..... 0 ..... 0 ..... ..... 3 1

... 1 ..... 0 ..... 0.3 .... 4

....... 1 ..... ..... 3 7

........... 4 ... 0.10(如果发生这种情况,分离为1 + 0)

.............. 5..1 = 51结果是51.

我想要的结果是一个双位数字。请帮忙。

+4

个人而言,我宁愿你首先表现出一些努力;你可以发布你有*不*工作?我也不清楚实际的计算规则是什么。 – 2014-10-08 12:00:53

+1

@DaveNewton它就像一个向下的pascal三角形,除非你需要将两位数字分成两个一位数字,如果你有两个或一个数字留下这个方案,然后将两个数字合并成一个,你会得到一个数字 - 是我的猜测。 – EpicPandaForce 2014-10-08 12:03:35

+1

这基本上只是列表操作,如果你可以有第二个'临时'列表,你计算出新的结果,然后替换原来的,那么它实际上非常容易 - 你只需添加'i'和'i + 1 ',添加到另一个列表中,检查数字是否大于10,将它们分成两个数字(首先除以10,然后将剩余部分作为新元素添加到该元素之后),然后检查是否有2个或更少列表中的元素,如果是,那么只需将其中的一个数字设置为5 * 10 + 1。这感觉就像是一个任务,我相信你可以做到这一点。 – EpicPandaForce 2014-10-08 12:07:16

回答

2
public static int yourFunction(ArrayList<Integer> list){ 
    String numbers = ""; // fill a string with your numbers 

    for(Integer i : list){ 
     numbers += String.valueOf(i); 
    } // could be nicer with java8 lambda function 


    String tmp_numbers; // temporary string needed 
    while(numbers.length() > 2){ 
     tmp_numbers = ""; 
     for(int i = 0; i < numbers.length()-1; ++i){ 
      // add two following numbers 
      // substring to read digit by digit 
      int v = Integer.parseInt(numbers.substring(i,i+1)); // first digit 
       v += Integer.parseInt(numbers.substring(i+1,i+2)); // + second 
      tmp_numbers = tmp_numbers + String.valueOf(v); // and fill the tmp string with it 
     } 
     numbers = tmp_numbers; // set the tmp string to our new beginning 
    } 
    return Integer.parseInt(numbers); 
} 
2

我认为如果您自己解决了这个问题,那么这对您可能会更好,但这是您的选择。 评论中的所有解释。

public static int countTriangle(List<Integer> list) { 
    if (list.size() == 0) { 
     // if list is empty return 0 
     return 0; 
    } else if (list.size() == 1) { 
     // if list contains only single element return this element 
     return list.get(0); 
    } else if (list.size() == 2) { 
     // if list contains two elements, return them connected 
     // for example we have list of 5 and 1 
     // we multiple 5 with 10 (50) and then add 1 to it, 
     // so the output of 5 and 1 will be 51 
     return list.get(0) * 10 + list.get(1); 
    } 
    // create new list for the next triangle's line 
    List<Integer> newList = new ArrayList<Integer>(); 
    // iterate over every element of existing list 
    for (int i = 0; i < list.size() - 1; i++) { 
     // a = current element + next element (last iteration will be with last but one element) 
     int a = list.get(i) + list.get(i+1); 
     // if a has two digits or more 
     if (a >= 10) { 
      // translate it to String 
      String s = String.valueOf(a); 
      // take every char of a String, translate it to number and add to new list 
      // for example if a = 157 then three new elements will be added to new list (1, 5, 7) 
      for (int j = 0; j < s.length(); j++) { 
       newList.add(Integer.valueOf(String.valueOf(s.charAt(j)))); 
      } 
     // if a has single digit 
     } else { 
      // add this to new list 
      newList.add(a); 
     } 
    } 
    // call this function with new list (next line) 
    return countTriangle(newList); 
} 
1
public void test() { 
    ArrayList<Integer> test = new ArrayList<Integer>(); 
    test.add(1); 
    test.add(0); 
    test.add(0); 
    test.add(3); 
    test.add(1); 
    ArrayList<Integer> ret = doTheMagic(test); 
    for (Integer i : ret) 
     System.out.println(i); 
    System.out.println(transformInDigit(ret)); 
} 

private int transformInDigit(final ArrayList<Integer> values) { 
    int ret = 0; 
    int size = values.size(); 
    for (int i = 0; i < values.size(); i++)   
     ret+=values.get(i)*Math.pow(10, size-i-1); 
    return ret; 
} 

private ArrayList<Integer> doTheMagic(final ArrayList<Integer> values) { 
    int size = values.size(); 
    if (size<=2) 
     return values; 
    ArrayList<Integer> ret = new ArrayList<Integer>(); 
    for (int i = 0; i < size - 1; i++) { 
     Integer newVal = values.get(i)+values.get(i+1); 
     if (newVal < 10) 
      ret.add(newVal); 
     else { 
      ret.add(newVal/10); 
      ret.add(newVal % 10); 
     } 
    } 
    return doTheMagic(ret); 
} 
0

因为你始终相同的数字量,你可以做,没有一个循环。 第一步,计算第一个元素+第二个元素,并将结果保存在新数组的第一个索引中。然后第二个+第三个和新数组的第二个索引中的结果。等等。然后,对新数组中的结果执行相同的操作,直至获得结果。

此外,您必须在每次计算后计算交叉总和。为此,您可以这样做:

public int crossSum(int n) { 
    int sum = 0; 
     while(n > 0) { 
      int digit = n%10; 
      sum += digit; 
      n /= 10; 
     } 
    return sum; 
}` 

在最后一步中,您不计算交叉总和。当只有一个数字时,在前面显示结果为零。所以你得到一个两位数的结果。