zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/jasonboren/p/13750576.html
Copyright © 2011-2022 走看看