翻转单词顺序(Java实现)

本题为剑指offer面试题42——1

牛客网测试地址::https://www.nowcoder.com/questionTerminal/3194a4f4cf814f63919d0790578d51f3



[编程题]翻转单词顺序列
  • 热度指数:67941  时间限制:1秒  空间限制:32768K
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

package go.jacob.day515;

public class Demo1 {
	/*
	 * 先对str进行反转,然后再单独对每个单词进行反转
	 */
	public String ReverseSentence(String str) {
		// 无效输入,用Str.trim()去除字符串两端的空格字符
		if (str == null || str.trim().equals(""))
			return str;
		char[] chars = str.toCharArray();
		chars = reverse(chars, 0, str.length() - 1);

		int wordBegin = 0;
		for (int i = 0; i < chars.length; i++) {
			if (chars[i] == ' ') {
				reverse(chars, wordBegin, i - 1);
				wordBegin = i + 1;
			}
			// 反转最后一个单词
			if (i == chars.length - 1)
				reverse(chars, wordBegin, i);
		}
		// 注意:这里也可以用new String(chars),但不能用chars.toString();
		return String.valueOf(chars);
	}

	/*
	 * 反转begin到end的字符顺序
	 */
	private char[] reverse(char[] chars, int begin, int end) {
		char tmp;
		while (begin < end) {
			tmp = chars[begin];
			chars[begin] = chars[end];
			chars[end] = tmp;
			begin++;
			end--;
		}
		return chars;
	}
}


题目二:左旋转字符串

牛客网测试地址:https://www.nowcoder.com/questionTerminal/85062aa6016640d188a6a0daf9f5da0e


  • 时间限制:3秒  空间限制:32768K

对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。

给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。

测试样例:
"ABCDEFGH",8,4
返回:"FGHABCDE"

package go.jacob.day515;

public class Demo2 {
	public String rotateString(String A, int n, int p) {
		char[] chars=A.toCharArray();
		chars=reverse(chars,0,n-1);
		chars=reverse(chars,0,n-2-p);
		chars=reverse(chars,n-p-1,n-1);
		return String.valueOf(chars);
	}
	
	private char[] reverse(char[] chars, int begin, int end) {
		char tmp;
		while (begin < end) {
			tmp = chars[begin];
			chars[begin] = chars[end];
			chars[end] = tmp;
			begin++;
			end--;
		}
		return chars;
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值