最近,我参加了一个面试。他们让我写一个程序来打印两个字符串中的独特字母和常用字符。我写了下面的代码来打印常用字符:
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);
}
}但他们说,他们对我的回答并不满意。我猜这是因为他们没有期待retainAll。所以,请告诉我正确的编程方式,以满足他们的未来。
我甚至用谷歌搜索了一下,但我没有找到任何好的、容易理解的链接。
那么,如何在不使用retainAll的情况下打印两个字符串中的唯一字符和常见字符呢
任何代码都将不胜感激。
发布于 2017-01-17 01:31:39
当你去面试时,如果他们像你说的那样问一些愚蠢的问题,那么他们就不会去寻找复杂的集合框架。他们正在寻找你是否可以用你的编码能力在草根级别做同样的事情,记住你如何编写能够处理情况的代码,即使所提供的数据高达数百万。
这个问题可以通过byte[]很容易地解决。我们知道char在内部是用数字表示的。
因此,在第一次迭代中,只需迭代第一个字符串(Str1)的字符,并将字节位置设置为某个常量,例如1。
for (int i=0; i<str1.length; i++) {
byteArr[(int)str.charAt(i)] = 1; // O(1)
}因此,在第二次迭代中,只需迭代第二个字符串的字符,并将字节位置设置为某个常量,例如,如果字节位置设置为1,则字节位置为2,如果字节位置设置为3,则表示字节位置对于str2是唯一的。
在第三次迭代中,只需迭代字节arr并打印字符(将索引转换为char),其中2表示通用,1/3表示唯一。
最终解决方案为O(n)且可伸缩。
https://stackoverflow.com/questions/29794233
复制相似问题