面试中的两个字符串问题竟给我整懵了?! | 原力计划

作者 | 一路向维

责编 | 王晓曼

出品 | CSDN博客

昨天收到通知,今天有个面试,一家魔都中型电商公司,名字咱就不说了。内心顿时踌躇满志、跃跃欲试,晚上还翻看面试题,做准备。

到了目的地之后,先把笔试题做完,面试官徐徐而来,一下来了两个,我估摸着一个是产品总监,一个是技术人员,很显然技术人员才是面试的主要提问者。

进来之后,六目相对凝视大概几秒钟,空气开始略显尴尬。产品领导就说你是XX吧,先简单介绍下自己,然后我就巴拉巴拉…

介绍完毕,此时产品总监仍在翻看我的简历,熟悉的六目相对变成了我和技术面试官的四目相对,技术人员率先打破尴尬,提出了玩个字符串游戏,接下来进入正题了。

如何判断两个字符串中含有几个相同字符

 

技术面试官问道:“如何判断一个字符串包含另一个字符串?有几种方式?这样,换个问题吧,如何判断两个字符串中含有几个相同字符?有几种方式?”

我脑子一转,脱口而出,“可以将字符串转化为字符数组,然后去循环遍历,在遍历后面加个 count 用来记数,这样应该就可以了。” 

心中窃喜,这反应还挺快的。

1、第一种方式,将字符串转化成数组

package com.roadway;

/**
 * @author roadway
 */
public class TestString {

    public static int judgeTwoString(String a, String b) {
        char[] aChar = a.toCharArray();
        char[] bChar = b.toCharArray();
        int r = 0;
        for (int i = 0;i < aChar.length ; i ++){
            for(int j = 0; j < bChar.length; j++){
                if(aChar[i] == bChar[j]) {
                    r++;
                }
            }
        }
        return r;
    }

    public static void main(String[] args) {
        System.out.println(judgeTwoString("abcdef", "bcd"));
    }
}

面试官:“嗯,不错,这是个实现方式,这是第一个,还有吗?”

略作思考状,想了一下,我答道:“可以使用 hashMap 去处理,我记得 map 有个方法叫 getOrDefault(),它可以允许调用者在代码语句中规定获得在 map 中符合提供的键的值,否则在没有找到提供的键的匹配项的时候返回一个“默认值”。这样可以计算出相同元素的数量。”

还好我之前碰到类似的问题,不然还真不知道还有啥方法了。

2、第二种方式, HashMap 方法

package com.roadway;

import java.util.HashMap;
import java.util.Map;

/**
 * @author roadway
 */
public class TestString {

    public static int judgeTwoString(String a, String b) {
        Map<Character, Integer> map = new HashMap<>();
        int count = 0;
        for(char c : a.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }

        for(int i = 0; i < b.length(); i++) {
            count += map.getOrDefault(b.charAt(i), 0);
        }

        return count;
    }

    public static void main(String[] args) {
        System.out.println(judgeTwoString("abcdef", "bcd"));
    }
}

面试官点头道:“这个方法倒是不常用,不过应该是可以实现的,还有别的方式去实现吗?”

“额…目前只能想到这两种方式了。”依稀能感觉到面试官旁边的产品总监动了一下。

回到家里研究了一下,发现方式还挺多的,以下方式都是回家后发掘的。

3、第三种方式,字符串直接进行比较

这种方式和第一种很像,只不过是用到了 charAt() 这个方法。

package com.roadway;

/**
 * @author roadway
 */
public class TestString {

    public static int judgeTwoString(String a, String b) {
        int count=0;
        for (int i=0;i<a.length();i++){
            for (int j=0;j<b.length();j++){
                if (b.charAt(j) == a.charAt(i)){
                    count+=1;
                }
            }
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println(judgeTwoString("abcdef", "bcd"));
    }
}

4、第四种方式,正则表达式

这种方式就厉害了,之前完全没想到过,竟然还有这种用法,简介明了,一行搞定,不过这样用效率会比较低。

package com.roadway;

/**
 * @author roadway
 */
public class TestString {

    public static int judgeTwoString(String a, String b) {
        return a.replaceAll("[^" + b + "]", "").length();
    }

    public static void main(String[] args) {
        System.out.println(judgeTwoString("abcdef", "bcd"));
    }
}

5、第五种方式, HashSet 方法

package com.roadway;

import java.util.HashSet;
import java.util.Set;

/**
 * @author roadway
 */
public class TestString {

    public static int judgeTwoString(String a, String b) {
        Set<Character> set = new HashSet<>();
        for (char c : a.toCharArray()) {
            set.add(c);
        }
        int res = 0;
        for (char c : b.toCharArray()) {
            if (set.contains(c)) {
                res++;
            }
        }
        return res;
    }

    public static void main(String[] args) {
        System.out.println(judgeTwoString("abcdef", "bcd"));
    }
}

目前是介绍的这5种比较常用的方式。

好了,继续回到和面试官的对话。

面试官面无表情的道:“没了?应该是不止这两种方式的,不过没事,咱们接着聊下个问题。如何判断一个字符串中哪个元素是最多的,并求出个数?”

如何判断一个字符串中哪个元素最多,并求出个数

和字符串杠上了这是?

沉思了片刻,慢慢思路有了。

我便答道:“先将字符串转换为字符数组,然后转存到 HashMap 集合中,集合的 key 为字符串中出现的字符,value 对应字符出现的次数。最后只需要在 HashMap 集合中找到 value 值最大的 key 就可以了。”

面试官点头道:“这个想法不错,具体实现你能写出来吗?”说着便拿过一张白纸,放在我面前。

卧槽无情,手写代码。虽然思路是有了,但纯手写对我来说确实太难了,恰好此时手不听使唤了(其实就是不想写了)。也许产品总监看到了我颤抖的双手,终于开始操作了。

产品总监直接问道:“对我们公司有啥想问的吗?”此处莫名点题了。“刚才也看到了这两个问题回答的不是很好。”

心想,什么鬼,这么快就面完了?然而我微笑着说道:“贵公司做的电商业务是全渠道的吗?”既然说了那还是得象征性的问下,寒暄了几句云云,聊天也就到此结束了。

回到家自己看了下发现有更好的实现方式,如下:

package com.roadway;

/**
 * @author roadway
 */
public class TestString {

    public static void judgeString(String str) {
        int max_length = 0;
        String max_str = "";
        while (str.length() > 0) {
            int length = str.length();
            String first = str.substring(0, 1);
            str = str.replaceAll(first, "");
            if (max_length < length - str.length()) {
                max_length = length - str.length();
                max_str = first;
            }
        }
        System.out.println(max_length + max_str);
    }

    public static void main(String[] args) {
        judgeString("abbcccddddaa");
    }
}

后记

 

可能因为疫情很多公司不怎么招人了,但还是会让 HR 去筛选简历找人过来面试,我猜这家公司就是这种情况。基本上很多东西都没问,就像是走个过场一样。

疫情期间,换工作不易,但希望还是有的,就看准备的怎么样了。

版权声明:本文为CSDN博主「一路向维」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/m0_37827190/article/details/106223703

更多精彩推荐
☞马云曾卖鲜花,柳传志卖冰箱!摆摊吧,程序员!
☞QQ 半自动发送情话,我追到了女神 | 原力计划
☞马化腾朋友圈晒微信支付分:835;爱奇艺回应用户隐私话题;Firefox 77.0 发布| 极客头条
☞韩版马化腾:在大财阀围堵下仍白手起家的凤凰男,抢滩加密交易平台、公链赛道
☞一个神秘URL酿大祸,差点让我背锅!
☞Uber 前无人驾驶工程师告诉你,国内无人驾驶之路还要走多久?
你点的每个“在看”,我都认真当成了喜欢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值