如何查看Java中的数组是否包含另一个数组的所有元素?

时间:2011-05-30 16:51:47

标签: java arrays

编写一个布尔函数,它将两个无序的char数组作为 参数。第一个数组的大小保证小于或 等于第二个数组的大小。如果,该函数返回true 第一个数组中的每个元素都包含在第二个数组中。

结果:

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;
}

4 个答案:

答案 0 :(得分:1)

以下四个步骤可以帮助您解决这些问题。

  1. 首先要了解问题所在。
  2. 识别功能和变量
  3. 想想你将如何在现实生活中做到这一点
  4. 编码。
  5. 最后一部分是最简单的部分。

    至于第3步:

    假设你有一个方框:

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

    和其他:

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

    如果你想知道A中的所有元素是否存在于B中,你将如何(在现实生活中)?

    嗯,你:

    1. 取第一个元素(a)
    2. 在B
    3. 中查找
    4. 如果它存在,你就是正确的(OK = true)。
    5. 如果不是,则以OK = false
    6. 结束
    7. 重复,直至完成所有元素。
    8. 尽管看起来很荒谬,但这是编码的第一步。

      现在采取每个步骤为它创建一个伪代码(不是真正的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提到的内容做好准备,您可以搜索更好的算法来优化您的搜索。

      但是,首先尝试以这种方式解决它。

      祝你好运

答案 1 :(得分:0)

缺少家庭作业标签吗?

由于处理重复的方式,我认为您应该将两个数组转换为Map<Character, Integer>计数。 (实际上,如果你知道'a'和'z'之间的输入是char,最好使用int数组来提高性能,但我会优化你。)完成此步骤后,您只需通过较小的数组并检查计数是否小于较大数组中的相应计数。

答案 2 :(得分:0)

你必须将每个角色都计算在一起。如果数组2中的每个字符的计数都高于数组1中的对应字符,则返回true,否则返回false。

答案 3 :(得分: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;
    }
}