• 9个关于String字符串的面试题


    (1)如何在字符串中获取不同的字符及其数量?

    public static void main(String[] args) {
        printDistinctCharsWithCount("jasonn");
        printDistinctCharsWithCountByLambda("jason小蜗牛");
    }
    
    /**
    * 实现思路:
    * 1、将输入的字符串转换成字符数组
    * 2、遍历这个字符数组,将这个字符放入map中,并用字符作为key,字符出现的次数作为value
    * 3、如果key不存在则说明出现的次数为1,此后将这个字符的原来的value加上1即可。
    *
    * @param input 输入的字符串
    */
    private static void printDistinctCharsWithCount(String input) {
        Map<Character, Integer> charsWithCountMap = new LinkedHashMap<>();
    
        for (char c : input.toCharArray()) {
            Integer oldValue = charsWithCountMap.get(c);
    
            int newValue = (oldValue == null) ? 1 : Integer.sum(oldValue, 1);
    
            charsWithCountMap.put(c, newValue);
        }
        System.out.println(charsWithCountMap);
    }
    
    // 采用lambda实现
    private static void printDistinctCharsWithCountByLambda(String input) {
        Map<Character, Integer> charsWithCountMap = new LinkedHashMap<>();
    
        for (char c : input.toCharArray()) {
            charsWithCountMap.merge(c, 1, Integer::sum);
        }
        System.out.println("采用lambda实现:" + charsWithCountMap);
    }
    // merge()方法是java 8出现的新特性,第一个参数为key,第二个参数为value,第三个参数为一个BiFunction函数式接口类型,
    // 它的特点是把判断和计算整合成为了一步操作。
    // 含义是如果key不存在则将key和value put到map中,如果key存在,则根据BiFunction计算的结果,重新覆盖原来的value值。
    

    (2)如何反转字符串?

    public static void main(String[] args) {
        reveseChar("jasonn");
    }
    
    /**
    * 实现思路:
    * 使用StringBuilder的reverse()即可
    *
    * @param input 输入的字符串
    */
    private static void reveseChar(String input) {
        StringBuilder stringBuilder = new StringBuilder();
        String str = stringBuilder.append(input).reverse().toString();
        System.out.println(str);
    }
    

    (3)如何判断一个字符串是前后对称的?

    public static void main(String[] args) {
        checkPalindromeString("jason小蜗牛");
        checkPalindromeString("jason小蜗牛 牛蜗小nosaj");
    }
    
    /**
    * 实现思路:
    * 1、将字符串从中间分成两部分
    * 2、进行判断第一个与最后一个,第二与倒数第二个是否相同,如果不同立马break
    *
    * 需要注意如下三点:
    * 1、for 循环的下标从 0 开始,到 length/2 结束
    * 2、下标 i 和 length-i-1 是对称的
    * 3、一旦 false 就 break
    *
    * @param input 输入的字符
    */
    private static void checkPalindromeString(String input) {
        boolean result = true;
        int length = input.length();
        for (int i = 0; i < length / 2; i++) {
            if (input.charAt(i) != input.charAt(length - i - 1)) {
                result = false;
                break;
            }
        }
        System.out.println(input + " 对称吗? " + result);
    
    }
    

    (4)如何删除所有出现的指定字符?

    public static void main(String[] args) {
        removeCharFromString("jason小蜗牛", 'n');
    }
    
    
    /**
    * 实现思路:
    * String类没有提供remove操作,但是提供了replaceAll方法
    * 因此只需要将出现的字符替换为空白即可
    *
    * @param input 输入的字符串
    * @param c     需要删除的指定字符
    */
    private static void removeCharFromString(String input, char c) {
        String result = input.replaceAll(String.valueOf(c), "");
        System.out.println(result);
    }
    

    (5)如何统计字符串中的单词数?

    public static void main(String[] args) {
        countNumberOfWords("My         name is java");
    }
    
    /**
    * 实现思路:
    * 1、去掉首尾空格,
    * 2、然后采用split方法,使用正则表达式,
    * 3、split的结果是数组,这个数组的长度就是单词个数
    *
    * @param line 输入的一行句子
    */
    private static void countNumberOfWords(String line) {
        String trimmedLine = line.trim();
        int count = trimmedLine.isEmpty() ? 0 : trimmedLine.split("\s+").length;
    
        System.out.println(count);
    }
    

    (6)如何判断一个字符串包含了另外一个字符串?

    public static void main(String[] args) {
        String s1 = "jason小蜗牛";
        String s2 = "j";
    
        System.out.println(s1.contains(s2));
    }
    
    // contains方法源码
    public boolean contains(CharSequence s) {
        return indexOf(s.toString()) > -1;
    }
    

    (7)如何在不用第三个变量的情况下交换两个字符串?

    public static void main(String[] args) {
        String s1 = "jason";
        String s2 = "小蜗牛";
    
        s1 = s1.concat(s2);
        s2 = s1.substring(0, s1.length() - s2.length());
        s1 = s1.substring(s2.length());
    
        System.out.println("s1=" + s1);
        System.out.println("s2=" + s2);
    }
    

    (8)如何从字符串中找出第一个不重复的字符?

    public static void main(String[] args) {
        System.out.println(printFirstNonRepeatingChar("jaasjoon小蜗牛"));
    }
    
    /**
    * @param string 输入的字符串
    * @return 返回结果字符
    */
    private static Character printFirstNonRepeatingChar(String string) {
        // 将字符串转换成字符数组
        char[] chars = string.toCharArray();
        // 声明一个字符list
        List<Character> characterList = new ArrayList<>();
    
        // 外层循环遍历chars数组
        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            // 如果characterList中已存在字符c则结束当前循环
            if (characterList.contains(c)) {
                continue;
            }
    
            // 从字符c的下一个字符开始遍历,如果后面的字符有与字符c相同的则加入到characterList中,结束这个循环
            // 如果从字符c的下一个字符开始直到最后一个字符都没有与此字符相同的,则此字符即为第一个不重复的字符
            for (int j = i + 1; j < chars.length; j++) {
                if (c == chars[j]) {
                    characterList.add(c);
                    break;
                } else if (j == chars.length - 1) {
                    return c;
                }
            }
    
        }
    
        return null;
    }
    

    (9)如何检查字符串中只包含数字?

    public static void main(String[] args) {
        digitsOnlyString("jaasjoon小蜗牛");
        digitsOnlyString("123479");
    }
    
    /**
    * 使用正则表达式进行判断是否只包含数字
    *
    * @param string 输入的字符串
    */
    private static void digitsOnlyString(String string) {
        if (string.matches("\d+")) {
            System.out.println("只包含数字的字符串:" + string);
        } else {
            System.out.println("此字符包含其他字符:" + string);
        }
    }
    
  • 相关阅读:
    贫血,充血模型的解释以及一些经验(非常经典)(非原创)
    源代码管理安装大全
    20条常见的编码陷阱 你中枪了没?(转)
    从30岁到35岁:为你的生命多积累一些厚度(转)
    Model1 与Model2(转)
    白话MVP(转帖)
    stl string 使用
    TerminateThread不要使用的證據
    C++静态成员函数小结(转)
    C/C++必知必会1
  • 原文地址:https://www.cnblogs.com/jasonboren/p/13750576.html
Copyright © 2020-2023  润新知