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

151.反转字符串中的单词

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

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

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

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

//使用栈实现,空间复杂度为O(n)
class Solution {
    public String reverseWords(String s) {
        if (s == null || s.isEmpty()) //shorcut
            return "";
        Stack<String> stack = new Stack<>();
        int start = 0;
        int end = s.length() - 1;
        while(s.charAt(start) == ' ')//去除前导空格
            start++;
        while(s.charAt(end) == ' ')//去除尾随空格
            end--;
        int wordStart = start;//两个指针用来截取单词
        int wordEnd = start;
        while(wordEnd <= end) {
            if(s.charAt(wordEnd) == ' ') {
                stack.push(s.substring(wordStart, wordEnd));
                stack.push(" ");//每压入一个单词的同时压入一个空格
                while(s.charAt(wordEnd) == ' ')
                    wordEnd++;//寻找下一个单词开头
                wordStart = wordEnd;
            }
            if(wordEnd == end) {//处理最后一个单词
                stack.push(s.substring(wordStart, end + 1));
            }
            wordEnd++;
        }
        StringBuilder result = new StringBuilder();
        while(!stack.empty()) 
            result.append(stack.pop());
        return result.toString();
    }
}

55.右旋字符串

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

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

import java.util.Scanner;
import java.lang.StringBuilder;
//使用StringBuilder类完成
public class Main {
    public static String reverseString(int k, String s) {
        StringBuilder result = new StringBuilder();
        result.append(s.substring(s.length() - k));//添加k后元素进result中
        result.append(s.substring(0, s.length() - k));//添加剩余元素
        return result.toString();
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int k = input.nextInt();
        String s = input.next();
        s = reverseString(k, s);
        System.out.println(s);
    }
}
  • 原地修改思路(java中String不可修改,只能申请辅助空间)
    • 将字符串全部反转,此时后k个元素成为前k个元素
    • 分别反转前k个元素和其余元素
    • 完成右旋
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值