Problem:
Start with two arrays of strings, a and b, each in alphabetical order, possibly with duplicates. Return the count of the number of strings which appear in both arrays. The best "linear" solution makes a single pass over both arrays, taking advantage of the fact that they are in alphabetical order.
commonTwo({"a", "c", "x"}, {"b", "c", "d", "x"}) → 2
commonTwo({"a", "c", "x"}, {"a", "b", "c", "x", "z"}) → 3
commonTwo({"a", "b", "c"}, {"a", "b", "c"}) → 3
Solution:
public int commonTwo(String[] a, String[] b) {
int count = 0;
String str = "";
for (int i = 0; i < b.length; i++) {
for (int j = 0; j < a.length; j++) {
if (a[j].equals(b[i]) && !str.contains(a[j])) {
str += a[j];
count++;
}
}
}
return count;
}

Here is a linear approach:
ReplyDeletepublic int commonTwo(String[] a, String[] b) {
String sames = "";
boolean run = true;
int aI=0;
int bI=0;
while (run) {
if (aI==a.length-1 && bI==b.length-1) {
run=false;
}
if (a[aI].equals(b[bI])) {
if (!sames.contains(a[aI])) sames += a[aI];
if (aI b[bI].charAt(0)){
if (bI<b.length-1) bI++;
else if (aI < a.length - 1) aI++;
}
}
}
return sames.length();
}
public int commonTwo(String[] a, String[] b) {
ReplyDeleteint result = 0;
int bcount = 0;
String temp = "";
for (int i=0; i0)
{
bcount++;
i--;
continue;
}
}
return result;
}
Another linear approach:
ReplyDeletepublic int commonTwo(String[] a, String[] b) {
int count = 0;
int ai = 0;
int bi = 0;
String found = "";
while(bi < b.length && ai < a.length){
if(a[ai].equals(b[bi]) && !a[ai].equals(found)){
found = a[ai];
count++;
ai++;
bi++;
}else if(a[ai].equals(b[bi]) && a[ai].equals(found)){
ai++;
bi++;
}else if(a[ai].compareTo(b[bi]) < 0){
ai++;
}else if(a[ai].compareTo(b[bi]) > 0){
bi++;
}
}
return count;
}
public int commonTwo(String[] a, String[] b) {
ReplyDeleteint count =0;
String ans = "";
for (int i = 0; i < a.length; i++)
for (int j = 0; j<b.length; j++)
if (a[i] == b[j] && a[i] != ans){
ans = b[j];
count++;
break;
}
return count;
}
public int commonTwo(String[] a, String[] b) {
ReplyDeleteint count = 0;
int index = 0;
boolean found = false;
String check[] = new String[a.length+b.length];
for (int n = 0, m = 0; nb[m].charAt(0))
m++;
else if (b[m].charAt(0)>a[n].charAt(0))
n++;
else {
n++;
m++;
}
}
return count;
}
public int commonTwo(String[] a, String[] b) {
ReplyDeleteint count = 0;
String bCat = "";
for (int n = 0; n < b.length; n++){
bCat += b[n];
}
for (int n = 0; n < a.length-1; n++){
if (a[n+1]!=a[n]){
if (bCat.indexOf(a[n])!=-1) count++;
}
}
if (bCat.indexOf(a[a.length-1])!=-1) count++;
return count;
}
public int commonTwo(String[] a, String[] b){
ReplyDeleteint count =0;
String found="";
for(int i=0; i<a.length; i++){
for(int j=0; j<b.length; j++){
if(a[i].equals(b[j]) && b[j]!=found){
count++;
found=a[i];
}
}
}
return count;
}
ArrayList < String > listA = new ArrayList< String >(Arrays.asList(a));
ReplyDeletelistA = new ArrayList(new LinkedHashSet(listA));
ArrayList < String > listB = new ArrayList< String >(Arrays.asList(b));
listB = new ArrayList(new LinkedHashSet(listB));
int count = 0 ;
for ( int i = 0 ; i < listA.size() ; i ++ ) {
for( int y = 0 ; y < listB.size() ; y ++ ) {
if(listA.get(i).equals(listB.get(y))) count ++;
}
}
return count;
this is the simplest linear solution
ReplyDeletepublic int commonTwo(String[] a, String[] b)
{
int count=0;
int i=0,j=0; String found = "";
while((i0 )
j++;
}
return count;
}
public int commonTwo(String[] a, String[] b) {
ReplyDeleteint p1 = 0;
int p2 = 0;
int count = 0;
String repeat = "";
while (p1 < a.length && p2 < b.length)
{
if (a[p1].compareTo(b[p2]) < 0)
{
p1++;
}
else if (b[p2].compareTo(a[p1]) < 0)
{
p2++;
}
else
{
if (!a[p1].equals(repeat))
{
count++;
repeat = a[p1];
}
p1++;
p2++;
}
}
return count;
}
public int commonTwo(String[] a, String[] b) {
ReplyDeleteSet hashSetSize = new HashSet<>();
Collections.addAll(hashSetSize,a);
int k = hashSetSize.size();
hashSetSize.clear();
Collections.addAll(hashSetSize,b);
k += hashSetSize.size();
Collections.addAll(hashSetSize,a);
return k-hashSetSize.size();
}
List list = Arrays.asList(b);
ReplyDeleteSet set = new HashSet();
for (String x:a){if (list.contains(x)) set.add(x);}
return set.size();
If you randomly insist on using i+1 logic to solve this, you'd do this:
ReplyDeletepublic int commonTwo(String[] a, String[] b)
{
int count =0;
if(a.length==1)
{
for(int z =0; z<b.length;z++)
{
if(a[0].equals(b[z]))
{
count++;
}
}
}
for(int i=0;i<a.length-1;i++)
{
if(a[i].equals(a[i+1]))
{
i+=0;
}
else
{
for(int j=0;j<b.length-1;j++)
{
if((b[j].equals(b[j+1]))&& j!=b.length-2)
{
j+=0;
}
else
{
if(a[i].equals(b[j])&&!(b[j].equals(b[j+1])))
{
//a[i].equals(b[b.length-1])||
count++;
}
if(j==b.length-2)
{
if(a[i].equals(b[b.length-1]))
{
count++;
}
if(i==a.length-2)
{
for(int k=0; k<b.length-1;k++)
{
if(!(b[k].equals(b[k+1])))
{
if(a[i+1].equals(b[k]))
{
count++;
}
}
}
if(a[a.length-1].equals(b[b.length-1]))
{
count++;
}
}
}
}
}
}
}
return count;
}
With Java stream and collections
ReplyDeletepublic int commonTwo(String[] a, String[] b) {
List list1 = Arrays.stream(a).distinct().collect(Collectors.toList());
List list2 = Arrays.stream(b).distinct().collect(Collectors.toList());
list1.retainAll(list2);
return list1.size();
}
public int commonTwo(String[] a, String[] b) {
ReplyDeleteint count = 0 ;
int compare = 0;
int indexB = 0;
int indexA = 0;
String valueToPass = "";
while (indexA0){
indexB++;
}
}
return count;
}