2017-03-07 106 views
1

我試圖做一些事情,我有兩個數字(比如說123和321)。我想檢查第一個數字是否與第二個數字相同。我知道如果我單獨檢查1,2和3,該怎麼做,但我想檢查整個整數。換句話說,我需要一個代碼,上面寫着「如果x(以任意順序)具有相同的數字,那麼......」 任何幫助都非常感謝!如何檢查一個數字是否以任何順序包含它自己?

+5

將兩個字符串拆分爲整數列表,對列表進行排序然後進行比較。 –

+0

如果其中任何一個數字都是負數,您希望發生什麼? – sprinter

+0

@sprinter我其實並沒有想過這件事。因爲我試圖做一個小型的博彩遊戲,所以這些數字不會是負面的。所以它會說:「如果你投注數字123,贏的數字是123,你贏600美元(作爲一個例子)。如果你投注123,贏的數字是231,你贏了200美元(因爲你有相同的數字,但是按照錯誤的順序),如果你投注了123並且數字是586,那麼你輸了。「如果數字是負數,我可能會說「這不是一個有效的投注或中獎號碼」。 – Andre

回答

2

不確定Java語法,但將每個數字轉換爲數組。按升序排列數組。轉換回數字並進行比較。

如果您不想完全匹配(即112233和123都共享相同的數字),然後遍歷1數組,並查看每個數字是否包含在另一個數字中。

1

此代碼會將這兩個整數轉換爲字符串,然後檢查字符串是否長度相同,第二個字符串是否包含第一個字符的所有字符。

public class Sandbox { //opens class 

    public static void main(String[] args) { 
     int x = 125; 
     int y = 321; 
     boolean hasNumbers = true; 
     String a = Integer.toString(x); 
     String b = Integer.toString(y); 

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

       if(!b.contains(String.valueOf(a.charAt(i)))) { 
        hasNumbers = false; 
       } 
      } 
      if(hasNumbers) { 
       System.out.println(x + " contains the digits of " + y); 
      } 
      else { 
       System.out.println(x + " does not contain the digits of " + y); 
      } 
     } 
     else { 
      System.out.println("The length of " + x + " and " + y + " are different"); 
     } 
    } 
} 

你絕對可以整理它,但我相信它解決了你陳述的問題。

+0

該算法的複雜性是O(n2),因爲b.contains是一個O(n)操作。我認爲可以在O(n)中完成。 – Simon

+0

OP究竟在哪裏說算法需要O(n)? –

+0

我不是說OP要求O(n)算法,但越快越好,不是嗎? :P – Simon

1

編輯:基本思想:該算法只是將出現在「a」中的所有數字存儲在一個集合中,並檢查是否存在「b」中不存在的任何數字。

這裏是一些實現這個邏輯的代碼。它基本上利用了這個事實,即Set不包含重複的元素。 HashSet可以執行add,包含在一個常量時間內,加上最大的數字大小設置爲10,該函數可以在O(n)中執行。

public boolean checkSameDigits(int x, int y){ 
    String a = Integer.toString(x); 
    String b = Integer.toString(y); 

    Set digits = new HashSet(); 
    for(int i = 0; i < a.length(); i++) { 
     digits.add(a.charAt(i)); 
    } 

    for(int i = 0; i < b.length(); i++) { 
     if(!digits.contains(b.charAt(i))) 
      return false; 
    } 
    return true; 
} 
0

如果轉換每個數字到數字的排序列表,那麼你可以只比較這兩個名單:

private List<Integer> sortedDigits(int number, int base) { 
    assert number >= 0 && base > 0; 
    List<Integer> digits = new ArrayList<>(); 
    for (int n = number; n > 0; n /= base) 
     digits.add(n % base); 
    digits.sort(); 
    return digits; 
} 

那麼接下來sortedDigits(number1, 10).equals(sortedDigits(number2, 10))將檢查數字是10爲基數

相同
0

相當短的實施是爲了得到每一個char[],排序,並檢查它們是相同的:

import java.util.Arrays; 

public class Whatever { 
    public static final boolean sameDigits(final int m, final int n) { 
     final char[] m2 = ("" + m).toCharArray(); 
     final char[] n2 = ("" + n).toCharArray(); 
     Arrays.sort(m2); 
     Arrays.sort(n2); 
     return Arrays.equals(m2, n2); 
    } 
} 
相關問題