#LeetCode#Problem557. Reverse Words in a String III-翻转字符串中的单词(java版)

读题

题目难度:easy
题目要求:

  1. 字符串中的单词以单个空格隔开,并且字符串中不会有任何额外的空格;
  2. 同时要保留空格和初始单词顺序。
    557.翻转字符串中的单词

思路

翻转了整个字符串

一开始没好好读题,也没有好好看示例,上来就直接写了,写完很开心,想怎么这么简单。结果Run Code时候发现不对,这个代码是把整个字符串都反转过来了。
input = “Let’s take LeetCode contest”;
output = “tsetnoc edoCteeL ekat s’teL”;

代码如下:

class Solution {
   public String reverseWords(String s) {
		String ss = s;
		
		char[] ch = new char[ss.length()];
    	ch = ss.toCharArray();
    	char ch2;
    	for(int i = 0; i < ss.length() / 2; i++) {
    		ch2 = ch[i];
    		ch[i] = ch[ss.length() - 1 - i];
    		ch[ss.length() - 1 - i] = ch2;
    	}
		
		String s1;
    	s1 = ss.valueOf(ch);
    	return s1;
    }
}

翻转字符串中的单词并保持单词顺序

要保持顺序,即需要根据空格识别出待反转的部分。代码中用a和b记录待反转部分的首尾,然后传到函数swapString()中翻转。为了方便,我重新声明了一个字符型数组,把要翻转的部分复制进去。运行的时候发现,假如要复制ch[]的a = 4到b = 7的部分,即长度为4时,应该是:

ch1 = Arrays.copyOfRange(ch, a, b+1);

或者用下面这句替代也是一样的:

System.arraycopy(ch, a, ch1, 0, b - a + 1);

代码如下:

import java.util.Arrays;
class Solution {
    public String reverseWords(String s) {
		String ss = s;
		char[] ch = new char[ss.length()];
    	ch = ss.toCharArray();
    	int a = 0,b = 0;
    	
    	for(int i = 0; i < ch.length; i++) {
    		if(ch[i] == ' ') {
    			b = i - 1;
    			swapString(ch,a,b);
    			a = i + 1;
    		}
    		if(i == ch.length-1) {
    			b = i;
    			swapString(ch,a,b);
    		}
    	}
		String s1;
    	s1 = ss.valueOf(ch);
    	return s1;
		
    }
	public void swapString(char[] ch, int a, int b){
		//ch,待翻转的数组,a,起始位置,b,终止位置
		char[] ch1 = new char[b - a + 1];
		ch1 = Arrays.copyOfRange(ch, a, b+1);
		//System.arraycopy(ch, a, ch1, 0, b - a + 1);	//这句也是一样的
		char temp;
    	
		for(int i = 0; i < (ch1.length + 1)/2; i++) {
    		temp = ch1[i];
    		ch1[i] = ch1[ch1.length - 1 - i];
    		ch1[ch1.length - 1 - i] = temp;
    	}
    	System.arraycopy(ch1, 0, ch, a, ch1.length)}    
}
   

最后提交成功:
557提交结果

感想

感想就是要好好看题啦,不然做半天会发现离题还有十万八千里呢。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值