2011-05-30 40 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。

相关问题