剑指Offer系列-面试题42:翻转单词顺序和左旋转字符串

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

思路:先把整个字符串翻转过来,然后再把每个单词翻转过来。

代码:

private void reverse(char[] chars, int begin, int end) {
	if (chars == null || chars.length < 2 || end - begin < 1) {
		return;
	}
	while (begin < end) {
		char tmp = chars[begin];
		chars[begin] = chars[end];
		chars[end] = tmp;
		begin++;
		end--;
	}
}

public String ReverseSentence(String str) {
	if (str == null || str.length() < 2) {
		return str;
	}
	char[] chars = str.toCharArray();
	int length = chars.length - 1;
	// 先把整个字符串反过来
	reverse(chars, 0, length);
	// 再依次翻转单个单词
	int begin = 0;
	int end = 0;
	while (end != length) {
		// 找到空格
		if (chars[end] == ' ') {
			reverse(chars, begin, end - 1);
			begin = end + 1;
		}
		end++;
	}
	reverse(chars, begin, end);
	return String.valueOf(chars);
}

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

思路:翻转前n个字符,再翻转后面的部分,最后翻转整个字符串。

代码:
public String LeftRotateString(String str, int n) {
	int length = str.length();
	if (str == null || length < 2 || n < 1) {
		return str;
	}
	char[] chars = str.toCharArray();
	// 翻转前n个字符
	reverse(chars, 0, n - 1);
	// 翻转后面的字符
	reverse(chars, n, length - 1);
	// 翻转整个字符串
	reverse(chars, 0, length - 1);
	return String.valueOf(chars);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值