首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Java从两个字符串打印出唯一的字母表?

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

Stack Overflow用户
提问于 2015-04-22 18:08:13
回答 9查看 10.9K关注 0票数 7

最近,我参加了一个面试。他们让我写一个程序来打印两个字符串中的独特字母和常用字符。我写了下面的代码来打印常用字符:

代码语言:javascript
运行
复制
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的情况下打印两个字符串中的唯一字符和常见字符呢

任何代码都将不胜感激。

EN

回答 9

Stack Overflow用户

发布于 2015-04-22 18:28:27

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

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

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

for (字符c: set1) { if (set2包含(C)){ System.out.println(c);}}

如果字母表是恒定的(并且足够小),您甚至可以使用位集,否则使用HashSet就可以了,它将实现大小写平均值performance.

  • sort O(n) iterate:对两个字符数组进行排序并一起迭代,以找到常见的(和唯一的)字符。而在java中,它并没有真正的好处(因为String是不可变的,所以无论如何您都需要创建一个新的char[] )--在其他语言中,它节省了空间,并且可以原地完成,只需要很少的额外空间。
票数 3
EN

Stack Overflow用户

发布于 2017-01-17 01:31:39

当你去面试时,如果他们像你说的那样问一些愚蠢的问题,那么他们就不会去寻找复杂的集合框架。他们正在寻找你是否可以用你的编码能力在草根级别做同样的事情,记住你如何编写能够处理情况的代码,即使所提供的数据高达数百万。

这个问题可以通过byte[]很容易地解决。我们知道char在内部是用数字表示的。

因此,在第一次迭代中,只需迭代第一个字符串(Str1)的字符,并将字节位置设置为某个常量,例如1。

代码语言:javascript
运行
复制
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)且可伸缩。

票数 3
EN

Stack Overflow用户

发布于 2015-04-22 19:07:47

打印两个字符串中的唯一字符和常用字符,而不使用retainAll。

代码语言:javascript
运行
复制
        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(" ", ""); 

结果:

代码语言:javascript
运行
复制
Common:danli
Unique:gvmIfebcoutsry
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29794233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档