代码随想录day08|344.反转字符串、541. 反转字符串 II、151.翻转字符串里的单词 、kmw55.右旋字符串

Leetcode344.反转字符串

注意:√

  1. 双指针,没啥可操作的
    public void reverseString(char[] s) {
        int left = 0;
        int right = s.length-1;

        while (left<right){
            char temp = s[left];
            s[left] = s[right];
            s[right] = temp;

            left++;
            right--;

        }
        System.out.println(s);
    }

Leetcode541. 反转字符串 II

注意:√

  1. 注意char[]转String的方法
  2. 可以使用new String
  3. 也可以使用String.valueof
    public String reverseStr(String s, int k) {
        char[] ss = s.toCharArray();
        int i = 0;
        int left = 0 + i * k;
        int right;
        if (k - 1 + i * k >= ss.length) {
            right = ss.length - 1;
        } else {
            right = k - 1 + i * k;
        }
        while (left < ss.length) {
            while (left < right) {
                char temp = ss[left];
                ss[left] = ss[right];
                ss[right] = temp;
                left++;
                right--;
            }
            i = i + 2;
            left = 0 + i * k;
            if (left < ss.length && k - 1 + i * k > ss.length) {
                right = ss.length - 1;
            } else {
                right = k - 1 + i * k;
            }
        }
        return new String(ss);
    }

卡码网:54.替换数字

注意:√

  1. 。。。。

Leetcode151.翻转字符串里的单词

注意:×

  1. 原本解决办法很简单,但是要求在原数组上改的话就需要操作一下
  2. 操作如下图所示:来源代码随想录
    在这里插入图片描述
//解法二:创建新字符数组填充。时间复杂度O(n)
class Solution {
    public String reverseWords(String s) {
        //源字符数组
        char[] initialArr = s.toCharArray();
        //新字符数组
        char[] newArr = new char[initialArr.length+1];//下面循环添加"单词 ",最终末尾的空格不会返回
        int newArrPos = 0;
        //i来进行整体对源字符数组从后往前遍历
        int i = initialArr.length-1;
        while(i>=0){
            while(i>=0 && initialArr[i] == ' '){i--;}  //跳过空格
            //此时i位置是边界或!=空格,先记录当前索引,之后的while用来确定单词的首字母的位置
            int right = i;
            while(i>=0 && initialArr[i] != ' '){i--;} 
            //指定区间单词取出(由于i为首字母的前一位,所以这里+1,),取出的每组末尾都带有一个空格
            for (int j = i+1; j <= right; j++) {
                newArr[newArrPos++] = initialArr[j];
                if(j == right){
                    newArr[newArrPos++] = ' ';//空格
                }
            }
        }
        //若是原始字符串没有单词,直接返回空字符串;若是有单词,返回0-末尾空格索引前范围的字符数组(转成String返回)
        if(newArrPos == 0){
            return "";
        }else{
            return new String(newArr,0,newArrPos-1);
        }
    }
}

卡码网:55.右旋字符串

注意:×

  1. 原本思路就是O(n)操作,创建新的数组,拿出来以后移动再放回去
  2. 下图的操作很有意思,先整体翻转再局部翻转就可以得到结果
    在这里插入图片描述
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());
        String s = in.nextLine();

        int len = s.length();  //获取字符串长度
        char[] chars = s.toCharArray();
        reverseString(chars, 0, len - n - 1);  //反转前一段字符串,此时的字符串首尾是0,len - n - 1
        reverseString(chars, len - n, len - 1);  //反转后一段字符串,此时的字符串首尾是len - n,len - 1
        reverseString(chars, 0, len - 1);  //反转整个字符串

        System.out.println(chars);

    }

    public static void reverseString(char[] ch, int start, int end) {
        //异或法反转字符串,参照题目 344.反转字符串的解释
        while (start < end) {
            ch[start] ^= ch[end];
            ch[end] ^= ch[start];
            ch[start] ^= ch[end];
            start++;
            end--;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值