如何使用Java从两个字符串中打印唯一的字母?

MMM*_*MMS 7 java

最近,我参加了一次采访.他们让我写一个程序来打印两个字符串中的唯一字母和常用字符.我编写了下面的代码来打印常见字符:

String s1 = "I am living in india";
String s2 = "india is a beautiful country";

char[] s1Array = s1.toCharArray();
char[] s2Array = s2.toCharArray();

LinkedHashSet<Character> s1CharSet = new LinkedHashSet<Character>();
LinkedHashSet<Character> s2CharSet = new LinkedHashSet<Character>();

for(char kc : s1Array){
    s1CharSet.add(kc);
}

for(char c: s2Array){
    s2CharSet.add(c);
}

s1CharSet.retainAll(s2CharSet);

if(s1CharSet.size()==0){
    System.out.println("There are no common characters between the two strings");
}
else{
    System.out.println(s1CharSet);
}
}
Run Code Online (Sandbox Code Playgroud)

但他们说他们对我的回答并不满意.我想这是因为他们没有料到retainAll.所以,请告诉我正确的编程方式,以便将来满足它们.

我甚至谷歌搜索,但我没有找到任何好的,可理解的链接.

那么,如何从两个字符串中打印出唯一且常用的字符而不使用retainAll

任何代码将不胜感激.

ami*_*mit 3

面试官可能想检查你对如何有效解决这个问题的内部原理的理解,而使用“retainAll()有点”错过了这个任务的目的。

要“从头开始”实现它,可以使用多种方法:

  1. 与您的解决方案类似 - 填充两个Set对象 - 每个字符串一个对象,然后通过以下方式检查它们之间的差异/共同元素:

    for (Character c : set1) {
        if (set2.contains(c)) {
            System.out.println(c);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    如果已知字母表是恒定的(并且足够小),您甚至可以使用位集,否则 aHashSet就可以并且将实现O(n)平均情况性能。

  2. 排序和迭代:对两个 char 数组进行排序并一起迭代以查找公共(和唯一)字符。虽然在java中它没有真正的好处(因为它String是不可变的,所以你无论如何都需要创建一个新的char[]) - 在其他语言中,它节省了空间并且可以在很少的额外空间的情况下就地完成。