我有一个整数数组列表。它将始终包含5个整数。现在假设它包含数字10031.现在我想在元素中进行这个计算。
在此号码中添加数字,直到您留下1位或2位数字。
1 ..... 0 ..... 0 ..... 3 ..... 1
... 1 ..... 0 ...... 3 .... 4
....... 1 ..... 3 ..... 7
........... 4 .... 10(当发生这种情况时,分成1 + 0)
.............. 5..1 = 51.结果是51。
我想要一个两位数的结果。请帮忙。
答案 0 :(得分: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 :(得分: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 :(得分: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);
}
答案 3 :(得分:0)
因为你总是拥有相同数量的数字,所以你可以在没有循环的情况下做到这一点。 在第一步,您计算第一个元素+第二个元素,并将结果保存在新数组的第一个索引中。然后是第二个+第三个,结果是新数组的第二个索引。等等。然后你对新数组中的结果做同样的事情,直到得到结果。
此外,您必须在每次计算后计算交叉和。为此,您可以执行以下操作:
public int crossSum(int n) {
int sum = 0;
while(n > 0) {
int digit = n%10;
sum += digit;
n /= 10;
}
return sum;
}`
在最后一步中,您不计算交叉总和。当只有一个数字时,显示结果,前面有一个零。所以你得到两位数的结果。