代码随想录算法训练营第八天|LeetCode151.翻转字符串里的单词、卡码网:55.右旋转字符串

1.LeetCode151.翻转字符串里的单词

题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/
文章链接:https://www.programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html#%E6%80%9D%E8%B7%AF
视频链接:https://www.bilibili.com/video/BV1uT41177fX

在这里插入图片描述

思路:
主要做如下三个步骤:
1.移除多余空格。
包括:首尾空格和中间多余空格
2.反转:整体反转+局部反转
①.将整个字符串反转。
将所有字符进行翻转。
②.将每个单词反转

解法:
class Solution {
    // public String reverseWords(String s) {
    //     String[] arr=s.trim().split(" ");
    //     List<String> list=new ArrayList<>();
        
    //     for(int i=0;i<arr.length;i++){
    //         if(arr[i].length()==0) continue;
    //         list.add(arr[i]);
    //     }

    //     int left=0;
    //     int right=list.size()-1;

    //     while(left<right){

    //         String temp=list.get(left);
    //         list.set(left,list.get(right));
    //         list.set(right,temp);
    //         left++;
    //         right--;
    //     }

    //     StringBuilder res=new StringBuilder();
    //     for(int i=0;i<list.size();i++){
    //         res.append(list.get(i));
    //         if(i<list.size()-1){
    //             res.append(" ");
    //         }
    //     }

    //     return res.toString();
    // }

    public String reverseWords(String s) {
        StringBuilder sa= new StringBuilder();

        //删除多余空格
        sa=removeSpace(sa,s);

        int start=0;
        int end=sa.length()-1;

        //字符串翻转
        sa=reverseString(sa,start,end);

        //单词翻转
        sa=reverseWord(sa);

        return sa.toString();
    }

    // 删除空格
    public StringBuilder removeSpace(StringBuilder sa,String s){
        int start=0;
        int end=s.length()-1;
       
        //删除开头和结尾的空格
         while(start<s.length()&&s.charAt(start)==' '){
            start++;
         }
         while(end>=0&&s.charAt(end)==' '){
            end--;
         }

         //删除中间的空格
         while(start<=end){
            if(s.charAt(start)!=' '||s.charAt(start-1)!=' '){
                sa.append(s.charAt(start));
            }
            start++;
         }

         return sa;

    }

    //翻转字符串
    public StringBuilder reverseString(StringBuilder sa,int start,int end){

        while(start<end){
            char temp=sa.charAt(start);
            sa.setCharAt(start,sa.charAt(end));
            sa.setCharAt(end,temp);
            start++;
            end--;
        }
        return sa;
    }

    //单词翻转
    public StringBuilder reverseWord(StringBuilder sa){
        int start=0;
        int end=1;
        int len=sa.length()-1;
        while(start<len){
            while(end<=len&&sa.charAt(end)!=' '){//找到单词的结尾
                end++;
            }

            reverseString(sa,start,end-1);//翻转单词
            start=end+1;
            end=start+1;
        }
        return sa;
    }
}

2.卡码网:55.右旋转字符串

题目链接:https://kamacoder.com/problempage.php?pid=1065
文章链接:https://programmercarl.com/kama55.%E5%8F%B3%E6%97%8B%E5%AD%97%E7%AC%A6%E4%B8%B2.html

在这里插入图片描述

思路:
整体反转+局部反转:
①先将整体字符串进行翻转;
②然后将各个局部的字符串进行翻转。
注意:右旋是将尾部的局部字符串移到头部;左旋是将头部的局部字符串移到尾部。
在这里插入图片描述

解法:
import java.util.Scanner;

public class D{
//    public static void main(String[] args){
//        Scanner scan=new Scanner(System.in);
//        int k=scan.nextInt();
//        scan.nextLine();//消耗换行符
//        String s=scan.nextLine();
//        String[] arr=s.split("");
//
//        D d=new D();
//        //整体翻转
//        d.reverse(arr,0,arr.length-1);
//
//        //局部翻转
//        d.reverse(arr,0,k-1);
//        d.reverse(arr,k,arr.length-1);
//
//        StringBuilder res=new StringBuilder();
//        for(int i=0;i<arr.length;i++){
//            res.append(arr[i]);
//        }
//
//        System.out.println(res);
//    }
//
//    public void reverse(String[] arr,int start,int end){
//        while(start<end){
//            String temp=arr[start];
//            arr[start]=arr[end];
//            arr[end]=temp;
//            start++;
//            end--;
//        }
//    }
    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 - 1);  //反转整个字符串
        
        //局部翻转
        reverseString(chars, 0, n - 1);  //反转前一段字符串,此时的字符串首尾尾是0,n - 1
        reverseString(chars, n, len - 1);  //反转后一段字符串,此时的字符串首尾尾是n,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--;
        }
    }
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值