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

目录

151. 反转字符串中的单词

题目链接:

题目要求:

题目用例:

实现思路:

实现代码:

测试代码:

55. 右旋字符串

题目链接:

题目要求:

实现思路:

实现代码:


151. 反转字符串中的单词

题目链接:

151. 反转字符串中的单词 - 力扣(LeetCode)

题目要求:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

题目用例:

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"

示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

提示:

  • 1 <= s.length <= 104
  • s 包含英文大小写字母、数字和空格 ' '
  • s 中 至少存在一个 单词

实现思路:

1.去除字符串两端的空格,并将多个连续空格替换为一个。

2.使用空格分割字符串得到单词数组。

3.反转单词数组(使用首尾指针或双指针法)。

4.使用StringBuilder来拼接反转后的单词数组,并在单词之间添加单个空格(注意不要在第一个单词前添加空格)。

5.将StringBuilder对象转换为字符串并返回。

实现代码:

class Solution {
/*    给你一个字符串 s ,请你反转字符串中 单词 的顺序。

    单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

    返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

    注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。
    返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。*/
    public String reverseWords(String s) {
        // 去除字符串两端的空格,并将多个连续空格替换为一个
        s = s.trim().replaceAll("\\s+", " ");
        // 使用空格分割字符串得到单词数组
        String[] words = s.split(" ");
        //定义首尾指针
        int start = 0;
        int end = words.length - 1;
        for (int i=0;i<words.length/2;i++) {
            String tmp = words[start];
            words[start] = words[end];
            words[end] = tmp;
            start++;
            end--;
        }
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < words.length; i++) {
            if(i>0)builder.append(" ");
            builder.append(words[i]);
        }
        return builder.toString();
    }
}

测试代码:

public class Test {
    public static void main(String[] args) {
       /* 示例 1:

        输入:s = "
        the sky is blue
        "
        输出:"
        blue is sky the
        "
        示例 2:

        输入:s = "  hello world  "
        输出:"world hello"
        解释:反转后的字符串中不能存在前导空格和尾随空格。
        示例 3:

        输入:s = "a good   example"
        输出:"example good a"
        解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。*/
        Solution solution = new Solution();
        //示例1:
        String s1=" the sky is blue ";
        System.out.println(solution.reverseWords(s1));
        //示例2:
        String s2="  hello world  ";
        System.out.println(solution.reverseWords(s2));
        //示例3:
        String s3="a good   example";
        System.out.println(solution.reverseWords(s3));

    }
}

55. 右旋字符串

题目链接:

55. 右旋字符串(第八期模拟笔试) (kamacoder.com)

题目要求:

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

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

实现思路:

1.计算实际移动数量:通过取k对字符串长度s.length()的模(k % s.length()),以确保k表示的是有效的字符移动数量。

2.创建字符数组和StringBuilder:

3.将后k个字符追加到StringBuilder:

使用一个循环,从charArray.length - k开始,到charArray.length - 1结束(包括这两个索引),将字符追加到str中。

将剩余字符追加到StringBuilder:

4.使用另一个循环,从0开始,到charArray.length - k - 1结束(包括这个索引),将字符追加到str中。

5.输出结果:将str转换为字符串(通过调用str.toString()),并打印到控制台。

实现代码:

import java.util.Scanner;

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

    例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。*/
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt();
        String s = sc.next();
        solve(k,s);
    }
    public static void solve(int k,String s) {
        // 如果k大于字符串长度,取模得到实际要移动的字符数
        k = k % s.length();
        char[] charArray = s.toCharArray();
        StringBuilder str = new StringBuilder();
        // 追加字符串s的后k个字符到StringBuilder中
        for (int i = charArray.length-k; i < charArray.length; i++) {
            str.append(charArray[i]);
        }
        // 追加字符串s的前(s.length() - k)个字符到StringBuilder中  
        for (int i = 0; i < charArray.length-k; i++) {
            str.append(charArray[i]);
        }
        System.out.println(str.toString());
    }
}

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值