第五期:字符串的一些有意思的操作

简介: 第五期:字符串的一些有意思的操作

PS:每道题解题方法不唯一,欢迎讨论!每道题后都有解析帮助你分析做题,答案在最下面,关注博主每天持续更新。


1. 替换空格

题目描述

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例1:

输入:s = “We are happy.”

输出:“We%20are%20happy.”

示例2:

输入:s = “hello world.”

输出:s = “hello%20world.”

解析:

在Java中我们要知道字符串的本身是没办法直接改变的,所有只能在一个新的字符串上面实现。

所有我们就有了思路,创建一个新的字符串,遍历老的字符串,当是空格的时候新的字符串加上个%20,不是空格直接加上这个字符,最后遍历完成,得到的字符串便是我们想要的结果。(方法一)

注意:


创建新的字符串不能创建String类型,要创建StringBuilder ,因为String在相加的时候一直创建新的字符串,消耗内存大。

-也可以使用库方法replace(),但是这样便失去了刷题的意义,而且在面试的时候,面试官也不希望看到这样的代码。(方法二)


2. 字符串的左旋转

题目描述

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例1:

输入: s = “abcdefg”, k = 2

输出: “cdefgab”

示例2:

输入: s = “lrloseumgh”, k = 6

输出: “umghlrlose”

解析:

这道题有个取巧的方法,就是应用切片函数,进行字符串的切片,调用substring()库方法。(方法一)。

面试的时候这种方法可能不让用,所以我们可以用另一种方法。

列表遍历拼接,创建一个StringBuilder的字符串,依次拼接k + 1到末尾字符,然后再拼接首位字符到k,最后返回字符串。(方法二)

还可以通过旋转字符的方式来做,但是比较麻烦,我们先把字符串转为字符数组,然后分别旋转0 ~ k-1,k ~ arr.length - 1坐标元素,最后再旋转整个数组,把这个数组再转化为字符串,我们便得到了我们想要的结果。(方法三)


3. 答案代码

3.1 替换空格

  //方法一
    public String replaceSpace(String s) {
        StringBuilder stringbuilder = new StringBuilder();
        int len = s.length();
        for(int i = 0; i < len; i++){
            char ch = s.charAt(i);
            if(ch == ' '){
                stringbuilder.append("%20");
            }else{
                stringbuilder.append(ch);
            }
        }
        return stringbuilder.toString();
    }
    //方法二 
  public String replaceSpace(String s) {
      return s.replace(" ", "%20");
  }


3.2 字符串的左旋转

  //方法一
    public String reverseLeftWords(String s, int n) {
        return s.substring(n) + s.substring(0, n); 
    }
    //方法二
    public String reverseLeftWords(String s, int n) {
        StringBuilder res = new StringBuilder();
        for(int i = n; i < s.length(); i++){
            res.append(s.charAt(i));
        }
        for(int i = 0; i < n; i++){
            res.append(s.charAt(i));
        }    
        return res.toString();
    }
    //方法三
    public String reverseLeftWords(String s, int n) {
        char[] arr = s.toCharArray();
        reverse(arr, 0, n - 1);
        reverse(arr, n, arr.length - 1);
        reverse(arr, 0, arr.length - 1);
        s = new String(arr);
        return s;
    }
    public void reverse(char[] arr, int left, int right){
        while(left < right){
            char tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }
    }


目录
相关文章
|
存储 算法 编译器
【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)(2)
【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)(2)
133 0
【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)(2)
|
存储 网络协议 编译器
【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)(3)
【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)(3)
【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)(3)
|
存储 缓存 安全
【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)(1)
【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)(1)
177 0
【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)(1)