面试题58:翻转字符串

题目:

翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出“student. a am I”。

分析:

第一步,对整句话翻转,“I am a student.”翻转得到“.tneduts a ma I”。

第二步,对每个单词进行翻转,也就得到了“student. a am I”。

解法:

package com.wsy;

public class Main {
    public static char[] chars;

    public static void main(String[] args) {
        chars = "I am a student.".toCharArray();
        int length = chars.length;
        int start = 0, end = length - 1;
        reverse(start, end);
        for (start = 0, end = 0; start < length; ) {
            if (chars[start] == ' ') {
                start++;
                end++;
            } else if (end == length - 1 || chars[end] == ' ') {
                if (end == length - 1) {
                    reverse(start, end);
                    break;
                } else {
                    reverse(start, --end);
                    start = ++end;
                }
            } else {
                end++;
            }
        }
        for (int i = 0; i < length; i++) {
            System.out.print(chars[i]);
        }
    }

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

题目:

左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串“abcdefg”和数字2,该函数将返回左旋转两位得到的结果“cdefgab”。

分析:

可以利用第一个题的方法,将字符串整体翻转一次,再对分割点两侧做一下翻转,就可以实现了,需要注意的是输入的n,可能超过字符串的长度,所以需要对n取模。

也可以直接在分割点将字符串分开,然后调换前后位置拼接起来。

解法:

package com.wsy;

public class Main {
    public static char[] chars;

    public static void main(String[] args) {
        chars = "abcdefg".toCharArray();
        int length = chars.length;
        int n = 0;
        n %= length;
        if (n < 0) {
            return;
        }
        reverse(0, n - 1);
        reverse(n, length - 1);
        reverse(0, length - 1);
        for (int i = 0; i < length; i++) {
            System.out.print(chars[i]);
        }
    }

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值