【问题标题】:In finding cumulative sum of a number in java , we should use string or list to store numbers?在java中求一个数字的累积总和,我们应该使用字符串还是列表来存储数字?
【发布时间】:2015-09-19 07:09:29
【问题描述】:

求一个数的累积和,我们应该使用stringArraylist来存储数字吗?

我做的代码在这里,我想知道有没有更高效的方法来做呢?

private static int cumulative_sum(int num) {
    int count = 0;

    for (int k = 1; k <= num; k++) {
        String number = k + "";
        for (int i = 0; i < number.length(); i++) {
            count = count + Integer.parseInt(number.charAt(i) + "");
        }
    }
    return count;
}

【问题讨论】:

  • 通过正确的格式使您的代码可读。
  • 对不起,为它。感谢 Tagir 的编辑。

标签: java string performance list


【解决方案1】:

您似乎想对从 1 到 num 的所有数字的数字求和。即使对于幼稚的算法,使用字符串也是不必要的,而且效率很低。您可以按顺序除以 10:

private static int cumulative_sum(int num) {
    int count = 0;

    for (int k = 1; k <= num; k++) {
        int number = k;
        while(number > 0) {
            count+=number % 10;
            number/=10;
        }
    }
    return count;
}

当您在内部创建String 时,它会执行类似的操作,但也会为每个新的String 对象(以及内部char[] 数组)分配内存。此外,您还为每个将其与空 String 连接的字符创建新的 String 对象,这也不是很快。因此,对于较大的 num 值,您在分配/释放内存时可能会有相当大的开销。相比之下,我的版本根本不创建或使用堆对象。我的简单基准测试表明,对于num = 1000000,我的版本快了 14 倍(13 ms vs 196 ms)。

请注意,有更有效的算法可以对从 1 到 num 的所有数字的所有数字求和。详情请见A037123

【讨论】:

  • 在使用字符串时,除了“约定”之外,效率有没有降低??
  • @ShijoJoseph,当然是。你的版本比我的慢一个数量级。我稍微更新了答案。
猜你喜欢
  • 2018-02-04
  • 2011-02-08
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多