反转字符串、反转字符串II、反转字符串中的单词

344. 反转字符串

这道题很简单,我们要反转字符串,很容易就想到用头尾两个指针来交换,代码如下。

java 复制代码
class Solution {
    public void reverseString(char[] s) {
        int left=0;
        int right=s.length-1;
        while(left<right){
            char tmp=s[left];
            s[left]=s[right];
            s[right]=tmp;
            left++;
            right--;
        }
    }
}

541. 反转字符串 II

这道题就稍微复杂一点,既然题目要求每计数至2k个字符再反转,那我们在for循环中让i一次+2k就行,我们要反转前k个,我们首先要确定i+k要小于s的长度,如果大于s的长度,则从i到s.length()-1,我们要把这一段去反转,反转的函数就可以用上面的题的代码。代码如下。

java 复制代码
class Solution {
    public String reverseStr(String s, int k) {
        char[] arr=s.toCharArray();
        for(int i=0;i<s.length();i+=2*k){
            if(i+k<=s.length())
            {
                reverse(arr,i,i+k-1);
                continue;
            }
            reverse(arr,i,s.length()-1);
        }
        return new String(arr);
    }
    public void reverse(char[] s,int left,int right) {
        while(left<right){
            char tmp=s[left];
            s[left]=s[right];
            s[right]=tmp;
            left++;
            right--;
        }
    }
}

151. 反转字符串中的单词

这道题就更复杂了,我们的做法是先把多余的空格消除,再将整串字符串倒置,最后把单词倒置。

例如:

1.hello world

2.hello world

3.dlrow olleh

4.world hello

就是以上的步骤。

消除空格:我们使用快慢指针的方法,在遍历时,如果fast不为空,且slow不是第一个字符时,我们就添加一个空格,代表单词前的一个空格,之后在fast小于数组长度且不为空的情况下,将fast的值赋给slow,部分代码如下。

java 复制代码
 int slow = 0;
        for (int fast = 0; fast < n; fast++) {
            if (arr[fast] != ' ') {
                if (slow != 0)
                 arr[slow++] = ' ';
                while (fast < n && arr[fast] != ' ') {
                    arr[slow++] = arr[fast++];
                }
            }
        }

倒置字符串:这个就很简单,根据第一题就可以写出。

倒置单词:这个也比较简单,以空格为判断条件来倒置单词。全部代码如下。

java 复制代码
class Solution {
    public String reverseWords(String s) {
        char[] arr = s.toCharArray();
        int n = arr.length;

        int slow = 0;
        for (int fast = 0; fast < n; fast++) {
            if (arr[fast] != ' ') {
                if (slow != 0)
                 arr[slow++] = ' ';
                while (fast < n && arr[fast] != ' ') {
                    arr[slow++] = arr[fast++];
                }
            }
        }

        reverse(arr, 0, slow - 1);
                                               
        int start = 0;
        for (int i = 0; i <= slow; i++) {
            if (i == slow || arr[i] == ' ') {
                reverse(arr, start, i - 1);
                start = i + 1;
            }
        }

        return new String(arr, 0, slow);
    }

    private void reverse(char[] arr, int left, int right) {
        while (left < right) {
            char tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }
    }
}
相关推荐
2401_841495642 小时前
【Python高级编程】近似串匹配
python·算法·动态规划·字符串·数组·时间复杂度·空间复杂度
虫小宝2 小时前
查券返利机器人的异步任务调度:Java XXL-Job+Redis实现海量查券请求的分布式任务分发
java·redis·分布式
lingggggaaaa2 小时前
安全工具篇&魔改二开&CheckSum8算法&Beacon密钥&Stager流量&生成机制
学习·算法·安全·web安全·网络安全·免杀对抗
Python+JAVA+大数据2 小时前
SQL玩出算法竞赛高度!郑凌云数独算法:递归CTE+位运算DFS回溯全解析
数据库·sql·算法·搜索引擎·深度优先·dfs
Hello World . .2 小时前
数据结构:哈希表(Hash table)
数据结构·vim·哈希算法·散列表
MicroTech20252 小时前
量子主成分分析(QPCA):微算法科技(NASDAQ :MLGO)重构图像降维与特征提取的技术
科技·算法·重构
历程里程碑2 小时前
滑动窗口------滑动窗口最大值
大数据·python·算法·elasticsearch·搜索引擎·flask·tornado
Mr_Xuhhh2 小时前
C语言字符串与内存操作函数模拟实现详解
java·linux·算法
瑞雪兆丰年兮2 小时前
[从0开始学Java|第十一天]ArrayList
java·开发语言