【问题标题】:Improving efficiency on returning duplicate numbers in an array提高返回数组中重复数字的效率
【发布时间】:2020-03-27 06:23:39
【问题描述】:

我正在努力提高我的代码的效率,

目的是简单地获取输出的重复项,在这种情况下,我选择了要计数的 #1,因此例如给定 N = 3, 11^3 = 1331,将返回 2,因为我们可以在输出中计算两个 1。

当处理更大的功率(其中 N 是一个很大的数)时,这自然会大大降低效率。

我设法提出了一个快速但低效的粗略解决方案,这似乎可行,但我能做些什么来改进代码及其效率?

import java.util.ArrayList;


public class Solution {

    private static int num = 11;

    public static int solution(int n) {

        int counter = 0;
        String compare = "1";
        double answer = Math.round(Math.pow(num, n));
        System.out.println(answer);

        String s = String.valueOf(answer);
        String[] parts = s.split("");

        for (int i=0; i<parts.length; i++){
            if (parts[i].equals(compare)){
                counter++;
            }
        }
        System.out.println(counter);
        return counter;
    }

    public static void main(String[] args) {
        solution(8);
        solution(3);
    }
}

任何有助于提高我对编写更高效代码的技术的理解的帮助以及对上面代码示例的改进都将不胜感激。

【问题讨论】:

  • 对于这样的问题,您会得到更多/更好的答复:codereview.stackexchange.com
  • 感谢@sleepToken
  • Math.pow(num, n) 不会花费更多时间来获得更大的 n 值。您可以使用toCharArray 代替split 并比较char 代替String,这样会更好。总而言之,在这两种情况下都没有什么好处,因为你很快就会用完小数精度,然后再花时间进行这种计算。

标签: java arrays algorithm performance


【解决方案1】:

拆分和正则表达式很慢(replaceAll),但replaceAll很短:

    counter = s.replaceAll("[^" + compare + "]", "").length();

    char[] parts = s.toCharArray();
    for (int i = 0; i < parts.length; i++) {
        if (parts[i] == '1') {
            counter++;
        }
    }

    for (char ch : parts) {
        if (parts[i] == '1') {
            counter++;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2021-01-23
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多