2016-02-22 38 views
-1

这不是一个真正的指向任何错误的问题,而是要求改进用java编写的程序。 这是一个非常简单的程序,用于查找给定整数数组中特定整数的出现次数。程序在发送者数组中查找数字的频率

但是,这个程序工作得很好,但我想知道是否可以通过此程序进行任何改进以节省时间或内存。

下面是程序:

import java.util.HashMap; 
import java.util.Map; 

public class Logix { 

public static void main(String args[]) { 
    int arr[] = { 10, 9, 8, 7, 3, 10, 8, 1, 8, 3, 1, 1 }; 
    int cnt = 0, count = 1; 
    Map<Integer, Integer> map = new HashMap<Integer, Integer>(12); 
    int currntN = arr[cnt]; 

    outer:while (cnt != arr.length) { 
     if(!map.isEmpty()){ 
      if(map.containsKey(arr[cnt])){ 
       cnt++; 
       continue outer; 
      } 
      currntN = arr[cnt]; 
      count=1; 
     } 
     for (int i = cnt + 1; i < arr.length; i++) { 
      if (currntN == arr[i]) { 
       count++; 
      } 
     } 
     cnt++; 
     map.put(currntN, count); 
    } 

    System.out.println(map); 
} 
} 

这是一个非常基本的初学者水平的计划。 我希望知道可以做一些改进。 谢谢

+1

国际海事组织,这个问题更适合[代码审查](http://codereview.stackexchange.com/)。 –

+0

我投票结束这个问题作为题外话,因为它是一个代码审查的请求。 – Raedwald

+0

你可以通过'arr'完成一次。另外,那个讨厌的标签打破了标签。 – Bathsheba

回答

-1

我看到你在你的解决方案中使用了两个循环。此问题的解决方案可以优化为仅使用单个循环。

这里是包含必要评论的代码片段。我希望它会帮助你理解这个概念:

public static void main (String[] args) 
{ 
    int[] arr = {10,9,8,7,10,9,8,7,10,9}; 
    calculateFrequency(arr); 
} 

public static void calculateFrequency(final int[] numberList) { 
    /* Calculate Frequency */ 
    Map<Integer,Integer> cnts = new HashMap<>(); 
    for (int i = 0; i < numberList.length; i++) { 
     /* Update Counts */ 
     cnts.put(numberList[i],cnts.containsKey(numberList[i]) ? cnts.get(numberList[i]) + 1 : 1); 
    } 

    /* Print Values */ 
    System.out.println(cnts); 
} 

如果你想遍历地图,那么你可以做到这一点,如下所示:

for (Map.Entry<Integer, Integer> entry : cnts.entrySet()) { 
    System.out.println("Number = " + entry.getKey() + ", Frequency = " + entry.getValue()); 
} 

输出:

Number = 7, Frequency = 2 
Number = 8, Frequency = 2 
Number = 9, Frequency = 3 
Number = 10, Frequency = 3 
+0

我相信这是一个很好的答案,因为你用单循环(O(n))解决了双循环(O(n^2))问题,我相信。) 在那个笔记上,如果我们要去为了“最大效率”,使用整数而不是双精度将是优选的。这太挑剔了,但是,我有点讨厌自己说;) – BRasmussen

+0

非常感谢你的回答 –

+0

为什么这是低票? @Harshvarshan请求你接受答案,如果它对你有帮助的话,可以对它投票。 – user2004685

-4
Arrays.sort(arr); 
for(int i=0;i<arr.length;) 
       { 
        count=1; 
        for(index=i+1;index<arr.length;index++) 
        { 
         if(arr[i]==arr[index]) 
         { 
          count++; 
         } 
         else{ 

          break; 
         } 


        } 
        System.out.println(" "+arr[i]+ " "+count); 
        i+=count; 

Hope my code provide answer to your problem.Happy coding. 
+0

绝对低俗。为什么第二个循环? – Bathsheba

+0

请包括评论并解释为什么您认为此解决方案更好。 – user2004685

+0

由于您仍在使用两个for-loops,所以时间复杂度仍然是O(n^2)。虽然我可以争辩说你的代码更干净,但是这个问题涉及改进时间/内存。 – BRasmussen