簡體   English   中英

數組| 使用數組除法查找重復整數?

[英]Arrays| Find repeating integers using array division?

如何使方法顯示重復的數字。 似乎是一個邏輯錯誤正在阻止我,而且我不知道為什么代碼不執行應做的事情。

  public static void findRepeating(int[] arr) { 
        for (int i = 0; i< arr.length; i++) {
             for(int d = 0; d<arr.length; d++) {
                 if(arr[i] / arr[d] == 1) {
                     System.out.println(arr[i] + " is repeating");
                 }
             }
        }
    }


    public static void main(String[] args) {

        int[] myArray = {69, 7, 8, 9, 90, 666, 69, 420, 2};


        findRepeating(myArray);

    }

}

這是內部for循環中邏輯的更正和比較

  public static void findRepeating(int[] arr) { 
    for (int i = 0; i< arr.length; i++) {
         for(int d = i+1; d<arr.length; d++) { //check with next element, as u will iterate over same element if iterating from start
             if(arr[i] == arr[d]) { // checking for same number, as division can give 1 in multiple case for ex 11/7 is also 1
                 System.out.println(arr[i] + " is repeating");
             }
         }
    }
}

問題在於您的if條件邏輯。

if (i != d && arr[i] / arr[d] == 1 && arr[i] % arr[d] == 0)

1)您應檢查是否沒有被同一數組元素除。 您可以改為從i+1而不是0初始化d的值。

2)除以等於1

3)模數應為0,因為除法邏輯對此邏輯還不夠。 正如@Eran所說的9/89/9也會得到1,但是使用模數檢查,我們可以確保我們打印出只有9重復

public static void findRepeating(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        for (int d = 0; d < arr.length; d++) {
            if (i != d && arr[i] / arr[d] == 1 && arr[i] % arr[d] == 0) {
                System.out.println(arr[i] + " is repeating");
            }
        }
    }
}

public static void main(String[] args) {
    int[] myArray = { 69, 7, 8, 9, 90, 666, 69, 420, 2 };
    findRepeating(myArray);
}

您的方法已經突出了這個問題,但是當您的數組大小太大(O(n ^ 2)的時間復雜度)時,不建議一次又一次地遍歷元素,而應考慮在O()中遍歷數組時進行遍歷n)時間為O(n)的額外空間

Set<Integer> hs = new HashSet<Integer>(); // to store elements
for (int i = 0; i< arr.length; i++) {
            if(hs.contains(arr[i])) { // Checking if element is present in set or not
                System.out.println(arr[i] + " is repeating");
            }else {
                hs.add(arr[i]);
         }
     }
}

您需要從第二個循環條件中排除當前的i索引。 對於較大的優化,您可以從索引i開始迭代第二個循環。

public static void findRepeating(int[] arr) {
        if(arr.length<2) { return; } // edge case condition
        for (int i = 0; i< arr.length; i++) {
            for(int d = i+1; d<arr.length; d++) { // start from i+1 index
                if( arr[i] == arr[d]) {
                    System.out.println(arr[i] + " is repeating");
                }
            }
        }
    }

現在它將打印:

69重復

否則,您將始終重復打印arr[i]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM