day09 151.翻转字符串里的单词 卡码网:55.右旋转字符串

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

Leetcode 151.翻转字符串里的单词
题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/description/
思路:
1、封装函数 removeKongGe

去除字符串中多余的首尾空格,中间空格

2、封装函数reverseString

反转整个字符串[start,end)

3、封装函数reverseWord

反转单词顺序

4、调用主函数reverseWords
图示:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

代码:
class Solution {
    public String reverseWords(String s) {
        // 去除字符串中多余的首尾空格,中间空格
        StringBuilder str = removeKongGe(s);
        // 翻转整个字符串
        reverseString(str,0,str.length()-1);
        // 反转单词
        reverseWord(str);
        return str.toString();
    }

    // 去除字符串中多余的首尾空格,中间空格
    public StringBuilder removeKongGe(String s){
        int start = 0 ;
        int end = s.length() - 1;
        StringBuilder str = new StringBuilder();
        // 去掉首尾空格
        while(s.charAt(start) == ' ') start++;
        while(s.charAt(end) == ' ') end--;
        // 去掉中间空格
        while(start<=end){
            char c = s.charAt(start);
            // StringBuilder 是 Java 中常用的字符串缓冲区类,适用于频繁修改字符串的场景。

            // append(): 将指定字符串、字符、布尔值或其他数据类型的表示追加到字符串缓冲区的末尾。
            if(c != ' ' || str.charAt(str.length() - 1) != ' '){
                str.append(c);
            }
            start++;
        }
        return str;
    }

    // 反转[start,end)
    public void reverseString(StringBuilder str , int start , int end){
        while(start < end){
            char temp = str.charAt(start);
            str.setCharAt(start,str.charAt(end));
            str.setCharAt(end,temp);
            start++;
            end--;
        }
        // //索引位1的字符进行替换
        // sb.setCharAt(1, 'E');
        // System.out.println("索引位1的字符进行替换后的结果:" + sb);
        // 索引位1的字符进行替换后的结果:hEllo
    }

    // 反转单词顺序
    public void reverseWord(StringBuilder str){
        int start =0;
        int end = 1;
        int  n = str.length();
        while(start<n){
            while(end<n && str.charAt(end) != ' '){
                end++;
            }
            reverseString(str , start ,end-1);
            start = end +1 ;
            end = start +1 ;

        }
    }
}
总结:

注意去掉空格中的删除中间空格操作

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

题目链接:https://kamacoder.com/problempage.php?pid=1065

题目描述:题目描述

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。

例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。

输入描述

输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出描述

输出共一行,为进行了右旋转操作后的字符串。

输入示例
2
abcdefg
输出示例
fgabcde
提示信息

数据范围:
1 <= k < 10000,
1 <= s.length < 10000;

思路 : 双指针法

1、声明两个首尾指针

2、将整个字符串反转

3、将字符串分割,反转

图示:在这里插入图片描述
代码:
import java.util.Scanner;

public class Main{
    // 将整个字符串倒序
    public static void reString(char[] c,int start,int end){
            while(start < end){
                c[start] ^= c[end];
                c[end] ^= c[start];
                c[start] ^= c[end];
                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[] cAll = s.toCharArray();
        // 将整个字符串倒序
        reString(cAll , 0 , len - 1);
        // 将 k = 2 , 假设字符串长度是n , n - k 分别倒序
        reString(cAll , 0 ,n - 1);
        reString(cAll , n ,len -1);
        // 返回需要的字符串
        System.out.println(cAll);
    }
}
总结:
学习了Scanner的用法
//用给定的输入流创建一个Scanner对象
Scanner in = new Scanner(System.in);        
//Integer.parseInt(String)就是将String字符类型数据转换为Integer整型数据,如果遇到不能转换的字符则会抛出异常!
int n = Integer.parseInt(in.nextLine());
//读取输入的下一行内容
String s = in.nextLine();


int x=Integer.parseInt("11");
// 将字符串"11"看成10进制的11,并按10进制输出整数11
int z = Integer.parseInt("11",16);
// 将字符串"11"看成10进制的11,并按10进制输出整数17
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值