【问题标题】:how i can optimize this java code?我如何优化这个java代码?
【发布时间】:2016-07-09 03:49:30
【问题描述】:

在下面的代码中,字符串在方法中传递,数字用空格分隔, 现在我们需要提供字符串中最小的两个数字的总和。

public class SumNearZero {
public static int SumNearZero(String s) {
String temp=s;
int t1=0;
for (int i = 0; i <s.length(); i++) {

    if(temp.contains(" "))
    {
        t1++;
        temp=temp.substring(temp.indexOf(" ")+1);
    }
}
int a[]=new int[++t1];
int index=0;
for(int i=0; i<s.length(); i++)
{
if(s.contains(" "))
{
    a[index]=Integer.parseInt(s.substring(0,s.indexOf(" ")));
    s=s.substring(s.indexOf(" ")+1);
    index++;
}

}
a[index]=Integer.parseInt(s);

for (int i = 0; i < a.length; i++) {

for(int j=0; j<a.length-1; j++)
{
    int c=a[j],n=a[j+1];
    if(c>n)
    {
        int t=c;
        a[j]=n;
        a[j+1]=t;

    }   }   }
int result=a.length>1 ? a[0]+a[1]:a[0];
return result;
  }
public static void main(String[] args) {
System.out.println(SumNearZero("35 96 10 20 5"));
       }
         }

上面的代码工作正常,但我想减少代码。如果您对此提出一些建议,我很乐意向您学习。

限制:集合的使用,预定义的方法,例如(String.split(),Arrays.sort()...)

【问题讨论】:

  • 代码可能正常工作,但风格很糟糕。 1)缩进很糟糕。 2) 违反标识符大写规则。 3) 无意义的变量名。 4)没有javadocs。 IMO,您应该在花时间尝试简化/优化代码之前解决这些问题。为什么?因为您要求其他人阅读您的代码……现在。
  • 如果你有比上面更好的代码作为答案。
  • 我会做得比这更好。将您的代码风格与 Elliott Frisch 的代码进行比较。看看他如何缩进他的代码?看看他如何使用正确的标识符样式以及如何一致的空格、一致的换行符等等?复制 Elliott 的代码风格!
  • 用集合来实现上面的代码很容易,我问过没有使用集合,请看问题中的限制。
  • piyushisingh - 你没有抓住重点。请再次阅读我的cmets。我说你的代码风格很糟糕。你说我如何改进我的代码风格。我说阅读 Elliot Frisch 的代码以获得良好风格的示例。 Elliot 的代码不满足您的其他要求这一事实无关紧要。它>确实

标签: java optimization logic


【解决方案1】:

我建议你不要在构造函数中执行计算和显示,创建一个静态方法并调用它。接下来,在该方法中,通过迭代将输入拆分为一个(或多个)空白字符生成的子字符串,创建IntegerList。然后,对List 进行排序。最后,返回前两个元素的总和1。对一个数字(或没有数字)进行一些错误检查也是一件好事。这可能看起来像

public static int sumNearZero(String s) {
    List<Integer> al = new ArrayList<>();
    for (String str : s.split("\\s+")) {
        al.add(Integer.parseInt(str));
    }
    if (al.isEmpty()) {
        return 0;
    }
    Collections.sort(al);
    if (al.size() == 1) {
        return al.get(0);
    }
    return (al.get(0) + al.get(1));
}

然后像这样调用它

public static void main(String[] args) {
    System.out.println(sumNearZero("35 96 10 20 5"));
}

我得到(如我所料)

15

1一次排序,前两个是最小值,后两个是最大值

【讨论】:

  • 不错的答案简短而甜蜜! @艾略特
  • 确实有用,但是如果代码中不允许使用 Collections 怎么办
  • @piyushsingh 那么你应该在问题中提到限制
【解决方案2】:

您可以通过每次使用for each loop 而不是 for 循环来使其更快,当数组、列表等的循环增加时,这是更推荐和更快的方法。

此外,您还可以通过使用拆分函数来获取字符串中的所有数字,该函数会检索这些数字的数组。然后您可以将逻辑用于获取小数字。如果您愿意,这通常会减少计数并提高速度了解优化,然后this 是权威指南,我建议您仔细阅读。并查看this 答案。

【讨论】:

  • @piyushsingh 仔细阅读 Elliot 的回答,这将是最快的方式
【解决方案3】:

看起来像一个练习,所以没有给出实际代码。

使用 String.split 和 Arrays.sort

【讨论】:

  • 这不是练习,我已经在上面发布了工作代码。
猜你喜欢
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多