最近,我参加了一个面试。他们让我写一个程序来打印两个字符串中的独特字母和常用字符。我写了下面的代码来打印常用字符:
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的情况下打印两个字符串中的唯一字符和常见字符呢
任何代码都将不胜感激。
发布于 2015-04-22 18:28:27
面试官可能想检查你对如何有效地解决这个问题的内部原理的理解,而retainAll()的使用有点偏离了这项任务的目的。
要“从头开始”实现它,可以使用几种方法:
Set对象-每个字符串一个,然后通过以下方法检查它们之间的差异/公共元素:for (字符c: set1) { if (set2包含(C)){ System.out.println(c);}}
如果字母表是恒定的(并且足够小),您甚至可以使用位集,否则使用HashSet就可以了,它将实现大小写平均值performance.
O(n) iterate:对两个字符数组进行排序并一起迭代,以找到常见的(和唯一的)字符。而在java中,它并没有真正的好处(因为String是不可变的,所以无论如何您都需要创建一个新的char[] )--在其他语言中,它节省了空间,并且可以原地完成,只需要很少的额外空间。发布于 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)且可伸缩。
发布于 2015-04-22 19:07:47
打印两个字符串中的唯一字符和常用字符,而不使用retainAll。
String firstString = "I am living in india";
String secondString = "india is a beautiful country";
HashSet<Character> h1 = new HashSet<Character>(), h2 = new HashSet<Character>();
for(int i = 0; i < firstString.length(); i++) {
h1.add(firstString.charAt(i));
}
for(int i = 0; i < secondString.length(); i++){
h2.add(secondString.charAt(i));
}
StringBuffer commonSB = new StringBuffer();
StringBuffer uniqueSB = new StringBuffer();
for(Character i : h1){
if(!h2.contains(i)){
uniqueSB.append(i);
}else{
commonSB.append(i);
};
}
for(Character i : h2){
if(!h1.contains(i)){
uniqueSB.append(i);
};
}
System.out.println("Common:"+commonSB.toString().replace(" ", "");
System.out.println("Unique:"+uniqueSB.toString().replace(" ", ""); 结果:
Common:danli
Unique:gvmIfebcoutsryhttps://stackoverflow.com/questions/29794233
复制相似问题