代码随想录刷题|LeetCode 344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.反转字符串里的单词 剑指Offer58-II.左旋转字符串

简介: 代码随想录刷题|LeetCode 344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.反转字符串里的单词 剑指Offer58-II.左旋转字符串

344.反转字符串

题目链接:力扣

思路

       遍历,用临时指针保存,进行替换

反转字符串

class Solution {
    public void reverseString(char[] s) {
        for (int i = 0 ; i < s.length/2 ; i++) {
            char temp = s[i];
            s[i] = s[s.length-1-i];
            s[s.length-1-i] = temp; 
        }
    }
}


541. 反转字符串II

题目链接:力扣

思路

java中String类的对象是不可改变的,String类中每一个看起来会修改String值的方法,实际上都创建并返回了一个全新的String对象,所以String自身没有灵活的reverse()功能,StringBiuder倒是有,但是这个题目是每隔一段,部分进行反转,所以StringBiuder也不是很灵活


       所以将String转换成字符数组进行操作,自定义reverse()方法


       这里continue使用真的很绝,将满足一般情况的操作写在if判断中,即保证了每次有k个元素都可以处理,又保证了最后剩下的元素进行反转


反转字符串||


   第一步:将String转换成字符数组(好操作)

       第二步:遍历数组,每2k个元素改变 i ,把没2k个字符看成一个整体

       第三步:如果 i + k <=  ch.length ,那说明这个2k整体元素是满的,那就进行反转

       第四步:题目中的两个条件(1、剩下的不够k个全反转 2、剩下的不过2k个反转前k个),其实第2种情况在第三步的步骤中已经包含了

class Solution {
    public String reverseStr(String s, int k) {
        // 将字符串转换成字符数组
        char[] ch = s.toCharArray();
        for (int i = 0; i < ch.length; i += 2*k) {
            // 每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
            // 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
            if (i + k <= ch.length) {
                reverse(ch , i, i+k-1);
                continue;
            }
            // 如果剩余字符少于 k 个,则将剩余字符全部反转
            reverse(ch , i , ch.length-1);
        }
        return new String(ch);
    }
    // 定义反转的函数
    public void reverse(char[] ch , int i , int j) {
        for ( ; i < j ; i++,j--) {
            char tmep = ch[i];
            ch[i] = ch[j];
            ch[j] = tmep;
        }
    }
}


剑指Offer 05.替换空格

题目链接:力扣

思路


   一开始呢,考虑的是将字符串用空格分隔,然后再进行字符串的拼接,每拼接一个单词后就加上“%20”,但是有一种情况没通过,那就是一个字符串全都是空格,这种方法是不全面的


64913ee3e45242389629bc69c1877ae4.png

所以将每一个字符都拿出来,如果是空格就加成“%20”,这样就是把字符串转换成字符数组


41b3cf3c53bf44b0aa4156e4854aa8ee.png


       最后发现,还是搞得有点复杂了,并不用转换成字符数组的,直接使用charAt()就可以的,这道题的整体思路还是比较简单的


       在代码随想录中,提供了一个双指针的方法,这个方法适用于C++语言,但是不适用于java语言,因为java中的String对象是不可改变的,不能进行原地修改和扩容,但是思路确实很妙,空间复杂度是O(1),但是对java语言不适用


替换空格

方法一:

class Solution {
    public String replaceSpace(String s) {       
        StringBuilder ss = new StringBuilder();
        for (int i = 0 ; i < s.length(); i++) {
            if (s.charAt(i) == ' ') {
                ss.append("%20");               
            } else {
                ss.append(s.charAt(i));
            }
        }
        return ss.toString();
    }
}


方法二(原地扩容,不适合java):

// 摘自《代码随想录》网站
class Solution {
    public String replaceSpace(String s) {       
        if(s == null || s.length() == 0){
            return s;
        }
        //扩充空间,空格数量2倍
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == ' '){
                str.append("  ");
            }
        }
        //若是没有空格直接返回
        if(str.length() == 0){
            return s;
        }
        //有空格情况 定义两个指针
        int left = s.length() - 1;//左指针:指向原始字符串最后一个位置
        s += str.toString();
        int right = s.length()-1;//右指针:指向扩展字符串的最后一个位置
        char[] chars = s.toCharArray();
        while(left>=0){
            if(chars[left] == ' '){
                chars[right--] = '0';
                chars[right--] = '2';
                chars[right] = '%';
            }else{
                chars[right] = chars[left];
            }
            left--;
            right--;
        }
        return new String(chars);
    }
}


151.反转字符串里的单词

题目链接:力扣

思路


 题目中说,字符串中会出现前导空格和尾随空格的情况,所以我们首先将字符串前后的空格去掉,然后对整个字符串进行分割,如果每个单词之间只有一个空格,那分割出来的整个数组就只有单词,但是如果中间有多个空格,会分割出来空字符串


15154381ecbf424fb0e2d1c94d6a31c0.png


       接下来对字符串进行重组,注意空字符串不要添加进去,注意不是空格,是空字符串


反转字符串里的单词

       第一步:清空字符串两边的空格

       第二步:使用空格字符串分割字符串(分割出来的数组元素有可能存在空字符串)

       第三步:进行判断,从数组后面一个元素往后添加

class Solution {
    public String reverseWords(String s) {
        s = s.trim();
        StringBuilder sb = new StringBuilder();
        String[] ss = s.split(" ");
        for (int i = ss.length - 1; i > 0; i--) {
            if (!ss[i].equals("")) {   
                sb.append(ss[i]);
                sb.append(" ");
            }
        }
        sb.append(ss[0]);
        return sb.toString();
    }
}


剑指Offer58-II.左旋转字符串

题目链接:力扣

思路

       前面部分要移动到后面,那就创建一个空字符串,先添加后面的,再添加前面的就可以

左旋转字符串

class Solution {
    public String reverseLeftWords(String s, int n) {
        // 定义一个接收字符串
        StringBuilder sb = new StringBuilder();
        // 先添加后面的字符
        for (int i = n; i < s.length(); i++) {
            sb.append(s.charAt(i));
        }
        for (int i = 0; i < n; i++) {
            sb.append(s.charAt(i));
        }
        return sb.toString();
    }
}
相关文章
|
7天前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
23 1
|
21天前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
22 9
|
21天前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
14 0
|
21天前
Leetcode(最后一个单词长度)
这篇文章介绍了两种解决LeetCode第58题的方法,即计算给定字符串中最后一个单词的长度,方法包括翻转字符串和逆向遍历统计。
15 0
|
21天前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
27 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
52 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
102 2
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
49 7