代码随想录刷题|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();
    }
}
相关文章
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
200 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
317 2
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
213 0
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
211 3
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
293 1
|
机器学习/深度学习
Leetcode第48题(旋转图像)
这篇文章介绍了LeetCode第48题“旋转图像”的解题方法,通过原地修改二维矩阵实现图像的顺时针旋转90度。
112 0
Leetcode第48题(旋转图像)
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
101 0
Leetcode第三十三题(搜索旋转排序数组)
|
存储 算法
LeetCode第48题旋转图像
LeetCode第48题"旋转图像"的解题方法,通过两次翻转操作——先水平翻转再对角线翻转,实现了原地旋转矩阵的效果。
LeetCode第48题旋转图像
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
188 1
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
173 0

热门文章

最新文章

下一篇
oss教程