使用 arraylists 得到错误的输出
Posted
技术标签:
【中文标题】使用 arraylists 得到错误的输出【英文标题】:Getting a wrong output using arraylists 【发布时间】:2019-09-29 02:59:23 【问题描述】:挑战是找到一个数字,其各个数字乘以连续递增的幂并相加,等于初始数字。
例如:取89,分成8和9,然后8^1 + 9^2 = 89
static List<Integer> sumDigPow(int a, int b)
List<Integer> eureka = new ArrayList<Integer>(0);
List<String> digits = new ArrayList<String>();
String num;
int sum = 0, multi;
for (int i=a; i<=b; i++)
num = String.valueOf(i);
digits.add(num);
for (int j=0; j<digits.size(); j++)
multi = (int)Math.pow(Integer.parseInt(digits.get(j)), j+1);
sum += multi;
if (sum == i) eureka.add(i);
sum = 0;
digits.clear();
return eureka;
输入 1 和 100(范围),输出应该是 [1, 2, 3, 4, 5, 6, 7, 8, 9, 89],但我得到了所有的数字[1, 2 ... 100]。
我最近才开始学习 java,但似乎无法在代码中找到问题所在。任何提示将不胜感激。
【问题讨论】:
【参考方案1】:您可以使用以下内容:
static List<Integer> sumDigPow(int a, int b)
List<Integer> eureka = new ArrayList<Integer>(0);
String num;
int sum = 0, multi;
for (int i = a; i <= b; i++)
num = String.valueOf(i);
for (int j = 0; j < num.length(); j++)
multi = (int) Math.pow(Character.getNumericValue(num.charAt(j)), j + 1);
sum += multi;
if (sum == i)
eureka.add(i);
sum = 0;
return eureka;
解释:
-
您没有检查号码的第二位。
循环遍历 String
num
的每个字符。
不需要digits
arraylist,你可以使用char的numeric值。
【讨论】:
【参考方案2】:问题是那些行:
num = String.valueOf(i);
digits.add(num);
您没有将号码拆分为数字。您只是将整数放入digits
列表中。看这段代码:
static List<Integer> sumDigPow(int a, int b)
List<Integer> eureka = new ArrayList<Integer>();
List<String> digits;
String num;
int sum = 0, multi;
for (int i = a; i <= b; i++)
num = String.valueOf(i);
digits = Arrays.asList(num.split(""));
for (int j = 0; j < digits.size(); j++)
multi = (int) Math.pow(Integer.parseInt(digits.get(j)), j + 1);
sum += multi;
if (sum == i) eureka.add(i);
sum = 0;
return eureka;
我只是使用Arrays.asList(num.split(""))
将您的字符串编号拆分为数字。它为a=1
、b=100
输出列表:
1
2
3
4
5
6
7
8
9
89
【讨论】:
行得通,谢谢。我使用 arraylist 来存储数字,只是为了使用 .clear() 方法,但我认为没有必要。 还有更多的优化可以做,但我尽量不修改你的代码:)【参考方案3】:使用char[]
将数字拆分为字符数组的数字(您只是将整个数字作为单个字符串添加到列表中,而不是单个数字):
...
char[] digits;
...
digits = String.valueOf(i).toCharArray();
然后,如果您从每个 char
数字中减去 '0'
,您将自动获得该数字的实际 int
值,而无需在字符串上调用 Integer.parseInt
方法或任何其他解析方法:
(int)Math.pow(digits[j] - '0', j + 1);
完整的代码如下所示:
static List<Integer> sumDigPow(int a, int b)
List<Integer> eureka = new ArrayList<Integer>();
int sum = 0;
char[] digits;
for (int i = a; i <= b; i++)
digits = String.valueOf(i).toCharArray();
for (int j = 0; j < num.length(); j++)
sum += (int)Math.pow(digits[j] - '0', j + 1);
if (sum == i) eureka.add(i);
sum = 0;
return eureka;
【讨论】:
以上是关于使用 arraylists 得到错误的输出的主要内容,如果未能解决你的问题,请参考以下文章
java throw new NoSuchElementException build failed with arraylist