CodingBat commonTwo方法,帮助检查输出?

时间:2016-04-30 07:00:04

标签: java arrays

问题摘要: 给定两个String数组,返回一个整数,表示它们之间有多少匹配(忽略重复)。

真实答案: http://www.javaproblems.com/2013/11/java-ap-1-commontwo-codingbat-solution.html

我的代码

public int commonTwo(String[] a, String[] b) {
    int count = 0;
    boolean done = false;
    for (int i = 0; i<a.length-1; i++){
      if(a[i].equals(a[i+1])){
      i++;
        for (String j:b)
          if (a[i].equals(j) && !done){
             done = true;
             count++;
          }   
      }
      else{
        for (String j:b)
          if(a[i].equals(j) && !done){
             done = true;
             count++;
          }
      }
    done = false;
    if(i == a.length-2)
        for (String j:b)
          if (a[i+1].equals(j) && !done){
             done = true;
             count++;
          }
     }
  return count;
} 

输出图像:[1]:http://i.stack.imgur.com/0esjC.png

所以它打算做的是遍历所有数组a,如果它等于下一个数组,则转到该索引,然后在数组之间匹配时添加计数。完成布尔值用于制作它,因此如果匹配a的b重复并且一旦找到匹配就结束它,它就不会添加计数。

最后,

if(i == a.length-2)
如果它是最后一个索引号之前的第二个(因为在某些情况下不会检查最后一个索引号),并且与最后一个索引号不同,那么

就是为了这样做,那么它会检查匹配检查最后一个索引号之后的最后一个索引号。我理解为什么两个错误都会发生,并且想知道可以做些什么来解决它,特别是对于第二个错误/对代码的评论。另外,我注意到的第三个问题是([“a”],[“a”])→1但代码将导致0。

3 个答案:

答案 0 :(得分:0)

这个问题可以做的是线性时间 O(N),它是数组a和b的单次遍历。

只要出现相同的字符串,就应该增加i。所以

if(a[i].equals(a[i+1]))
      i++;

应替换为

while(i+1<a.length&&a[i].equals(a[i+1])){
      i++;}

此外,您不需要遍历整个数组b以获取单个字符串a,因为两者都按字母顺序排列。您应该只比较来自只要没有匹配就可以得到数组。一旦找到匹配,你就应该记住那个索引和下一次匹配应该继续从该索引继续进行数组b

此外,您不需要布尔变量done

记住这些事情的正确代码是:

 public static int commonTwo(String[] a, String[] b) {
    int count = 0;         
    int j=0,i;       
    for (i = 0; i<a.length-1&&j<b.length-1;){
      //SKIP DUPLICATES FOR ARRAY a
      while(i+1<a.length&&a[i].equals(a[i+1])){
      i++;}
      //SKIP DUPLICATES FOR ARRAY b
      while(j+1<b.length&&b[j].equals(b[j+1])){
      j++;}

      //MATCH THE STRINGS FROM ARRAY a AND ARRAY b
      while(i<a.length&&j<b.length&&a[i].compareTo(b[j])!=0)
      {
      //INCREMENT I IF STRING IN ARRAY a IS LESS THAN STRING IN ARRAY b
       if(a[i].compareTo(b[j])<0)
        ++i;
      //INCREMENT J IF STRING IN ARRAY b IS LESS THAN STRING IN ARRAY a 
       else ++j;
      }

      //IF ABOVE LOOP BREAKS BECAUSE OF MATCH
      if(i<a.length&&j<b.length)
       {count++; ++j; ++i;}
     }

    //IF THE LAST ELEMENT OF ARRAY a IS LEFT FOR COMPARISON
    if(i==a.length-1)
    {
     while(j<b.length)
     {

      //SKIP DUPLICATES OF ARRAY b
      while(j+1<b.length&&b[j].equals(b[j+1]))
       ++j;

      if(a[i].equals(b[j]))
       {++count;}
      ++j;
     }
    }
    //IF THE LAST ELEMENT OF ARRAY b IS LEFT FOR COMPARISON
    if(j==b.length-1)
    {
     while(i<a.length)
     {
      //SKIP DUPLICATES OF ARRAY a
      while(i+1<a.length&&a[i].equals(a[i+1]))
       ++j;

      if(a[i].equals(b[j]))
       ++count;
      ++i;
     }
    }
   return count;
  } 

答案 1 :(得分:0)

这是我能想到的最简单的解决方案,它只使用一个循环。

public int commonTwo(String[] a, String[] b) {
    int count = 0;
    int i = 0;
    int j = 0;
    String s = "";

    while (i < a.length && j < b.length) {
        if (a[i].compareTo(b[j]) < 0) 
            i++;
        else if (a[i].equals(b[j]) && a[i] != s) {
            s = a[i];
            count++;
            i++;
            j++;
        }
        else j++;
    }

    return count;
}

答案 2 :(得分:0)

public int commonTwo(String[] a, String[] b) {
        int ctr = 0;
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < b.length; j++) {
                if (i > 0 && a[i] == b[j] && a[i] != a[i - 1]) {
                    ctr++;
                    break;
                } else if (i == 0 && a[i] == b[j]) {
                    ctr++;
                    break;
                }
            }
        }
        return ctr;
    }