算法练习Day9| 151.翻转字符串里的单词 55. 右旋字符串

#算法#Java#字符串#leetcode

今天刚做完题,依然是两道字符串相关的题目。已经马上凌晨了,废话少说,直接上代码。

151.翻转字符串里的单词

题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)

这道题我第一眼想法是:先去掉首位的空格,再将字符串按照空格split行成String数组,然后对数组做翻转,然后再append,中间加上空格。当然这样可以实现,但是对于算法题来说意义不大。

第二种思路:

        1. 先去掉多余的空格,包括单词与单词之间的空格

        2. 翻转整个字符串

        3. 按照单词来翻转字符串

两种思路具体代码:

public String reverseWords(String s) {
        if(null == s) {
            return s;
        }
        //解法一,转为字符串数组,反转。(不推荐)
        // s = s.trim();
        // String[] ss = s.split(" +");
        // int length = ss.length;
        // int left = 0; 
        // int right = length - 1;
        // while(left < right) {
        //     String temp = ss[left];
        //     ss[left] = ss[right];
        //     ss[right] = temp;

        //     left++;
        //     right--;
        // }
        // StringBuilder sb = new StringBuilder();
        // sb.append(ss[0]);
        // for(int i = 1; i < length; i++) {
        //     sb.append(" ").append(ss[i]);
        // }

        // return sb.toString();

        //解法二 1.先去多余的空格;2.整体反转字符串;3. 反转单个单词
        int start = 0;
        int end = s.length() - 1;
        while(s.charAt(start) == ' ') { start++;}
        while(s.charAt(end) == ' ') { end--;}
        StringBuilder sb = new StringBuilder();
        while(start <= end) {       //Note!!!
            if(s.charAt(start) != ' ' || sb.charAt(sb.length() - 1) != ' ') {
                //start 不是空格且sb最后一个不是空格,则添加
                sb.append(s.charAt(start));
            }
            start++;
        }
        
        //整体反转字符串
        int left = 0;
        int right = sb.length() - 1;
        while(left <right) {
            char temp = sb.charAt(left);
            sb.setCharAt(left,  sb.charAt(right));
            sb.setCharAt(right, temp);

            left++;
            right--;
        }

        //单个单词反转
        int sbLength = sb.length();
        int start1 = 0;
        int end1 = start1 + 1;
        while(start1 < sbLength) {
            while(end1 < sbLength && sb.charAt(end1) != ' ') {    //找单词
                end1++;
            }
            reverseString(start1, end1 - 1, sb);

            start1 = end1 + 1;
            end1 = start1+1;
        }
        
        return sb.toString();
    }

    private void reverseString(int left, int right, StringBuilder sb) {
  
        while(left < right) {
             char temp = sb.charAt(left);
            sb.setCharAt(left,  sb.charAt(right));
            sb.setCharAt(right, temp);

            left++;
            right--;
        }
    }

这里其实有挺多细节需要注意的,代码里面做了注释,我也是调试了很多次,leetcode直接敲没有自动提示就很难受,敲完还一堆编译问题。

55. 右旋字符串

题目链接:55. 右旋字符串(第八期模拟笔试)

这道题不是leetcode的,是代码随想录里面的题目,点链接同样可以打开看到。

这道题整体是对字符串翻转的运用,先整体翻转,然后翻转子字符串。这个思路是按照代码随想录里面的思路解决的,目前没仔细想其他思路。

具体代码:

import java.util.Scanner;

public class Main {
    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);  //反转前一段字符串
        reverseString(chars, n, len - 1);  //反转后一段字符串
        
        System.out.println(chars);

    }

    public static void reverseString(char[] ch, int start, int end) {
        while (start < end) {
            char temp = ch[start];
            ch[start] = ch[end];
            ch[end] = temp;
            
            start++;
            end--;
        }
    }
}

这个思路看代码就很清晰,有其他解决方法的朋友欢迎留言交流。

今天就到这里了,继续加油呀!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值