2011-05-30 545 views
0

編寫一個布爾函數,該函數將兩個無序的char數組作爲 參數。第一個數組的大小保證小於或等於第二個數組的大小。或者 等於第二個數組的大小。如果 第一個數組中的每個元素都包含在第二個中,則該函數返回true。如何查看Java中的數組是否包含另一個數組的所有元素?

結果:

Array One   Array Two   Return 
"a"     "a"     True 
"aa"    "ab"    False 
"cbb"    "abbc"    True 
"abbccdd"   "abbcccdd"   True 

編輯這是我嘗試迄今:

public static Boolean cmprStr(String s1, String s2) 
{ 
    for(int i = 0; i < s1.length(); i++) 
    { 
     if(!s2.contains(String.valueOf(s1.charAt(i)))) 
     { 
      return false; 
     } 
    } 
    return true; 
} 
+3

聽起來像家庭作業。到目前爲止你做了什麼?你的嘗試在哪裏? – Howard 2011-05-30 16:54:15

+1

正在做作業嗎? – 2011-05-30 16:54:22

+0

這很簡單,你只需要檢查One中的每個元素是否存在於Two中。想想如果你有一個帶有......顏色的盒子,你必須知道盒子「A」中的每種顏色是否存在於盒子「B」中,你會怎麼做。你如何在現實生活中(與真實的物體)做到這一點?一旦你有了,編碼是很容易的部分。 – OscarRyz 2011-05-30 16:54:42

回答

0

終於做到了!

import java.util.Arrays; 

class stringClass 
{ 
    public static void main(String args[]) 

    { 
     char s1[] = { 'a', 'b', 'b', 'c', 'c', 'd', 'd' }; 
     char s2[] = { 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd' }; 

     Boolean ret = cmprStr(s1, s2); 

     System.out.println(ret); 
    } 

    public static Boolean cmprStr(char[] s1, char[] s2) 
    { 
     char subS2[] = new char[s1.length]; 
     int cnt = 0; 

     Arrays.sort(s1); 
     Arrays.sort(s2); 

     for(int i = 0; i < s1.length; i++) 
     { 
      for(int j = 0; j < s2.length; j++) 
      { 
       if(s1[i] == s2[j]) 
       { 
        subS2[cnt++] = s1[i]; 
        s2[j] = ' '; 
        break; 
       } 
      } 
     } 

     if(Arrays.equals(s1, subS2)) 
     { 
      return true; 
     } 

     return false; 
    } 
} 
0

是一門功課的代碼中?

由於處理重複的方式,我認爲你應該將兩個數組轉換成Map<Character, Integer>與計數。 (實際上,如果你知道輸入是'a'和'z'之間的輸入是char,最好使用int的數組來表現,但我會留給你優化。)一旦完成了這一步,通過較小的陣列並檢查計數是否爲大於1的相應計數爲≤。

+0

你能舉一個代碼示例嗎? – Shamoon 2011-05-30 17:07:57

+0

當然,我的平均費用爲每小時90美元。 – 2011-05-30 17:09:41

+0

對於唯一一個使用正確算法的+1,雖然對於初學者來說已經有點太優化了;) – Voo 2011-05-30 17:34:48

1

以下四個步驟可以幫助您解決這些問題。

  1. 首先了解問題所在。
  2. 確定你會怎麼做,在現實生活
  3. 代碼它的函數和變量
  4. 思考。

最後一部分是最簡單的一部分。

至於第3步:如果你

B = [a,b,b,c,c,c,d,d] 

你怎麼會去(在現實生活中):

假設你有一個盒子:

A = [a,b,b,c,c,d,d] 

與其他有想知道A中的所有元素是否存在於B中?

那麼你:

  1. 採取的第一個元素(一)
  2. 尋找它在B中
  3. 如果它存在,你的權利正在軌道上(OK = TRUE)。
  4. 如果它不以OK = false結束
  5. 重複,直到完成所有元素。

這看起來很荒謬,這是編碼的第一步。

現在走的每一步,一旦你有這部分正確和完整的爲它創建一個僞代碼(不是真正的Java代碼)

//1. Take the first element (a) 
    e = A[0] 
//2. Look for it in in B 
    for each x in B do 
     if x == b found = true 
    end 
    found = false 
//3. If it exists, you're right on track (OK = true). 
    if found == true ? OK = true continue... 
//4. If it doesn't you end with OK = false 
    else OK = false 
//5. Repeat until you finish with all the elements. 
    go to 1.- using A[1] 

Check the value of "OK" at the end and that will be your answer. 

通知我的僞代碼可以是錯誤的,你必須爲自己檢查它),那麼你有能力編寫代碼,這將是非常簡單的。後來,當你完全理解了這個過程時,你可以跳過寫下算法的部分,你可以準備好Andrew Lazarus提到的內容,你可以搜索更好的算法來優化你的搜索。

但是,試着先這樣解決它。

祝你好運

+0

發佈錯誤的問題的最重要部分的僞代碼(這是不是可以用這種方法平凡解決)? ;)該算法不適用於A:「aa」和B:「ab」 - 另一個bug很容易修復,但那個似乎更難...... – Voo 2011-05-30 17:31:30

+0

@Voo不是真的,僞代碼沒有給出答案,而是一種**思考**的方式,對於想要學習編程的人來說非常有價值。我也注意到我的算法在前期是錯誤的) – OscarRyz 2011-05-30 17:37:12

+0

當然,但我認爲會讓這個可憐的傢伙感到困惑,然後再幫助 - 但是我先是一個可怕的老師,所以我肯定不是最好的人討論這個問題;) – Voo 2011-05-30 17:42:05

0

你必須計算每個字符它都是數組。如果數組2中的每個字符的計數均高於數組1中的對應字符,則返回true,否則返回false。

相關問題