字符串之翻转字符串

题目:

给定一个字符类型的数组chas,请在单词间做逆序调整,只要做到单词顺序即可,对空格的位置没有特别要求。

例如:

如果把chas看作字符串为“dog loves pig”,调整成“pig loves dog”.
如果把chas看作字符串为“I'm a student. ”,调整成“student. a I'm .

代码:

package com.chenyu.string.cn;

import java.util.Arrays;


public class RotateWord {
	
	public static char[] chars1 = {'p', 'i', 'g', ' ', 'l' , 'o', 'v', 'e', ' ', 'd', 'o', 'g'};
	public static char[] chars2 = {'l', '\'', 'm', ' ','a', ' ', 's', 't', 'u', 'd', 'e', 'n', 't', '.'};
	
	public static char[] chars3 = {'p', 'i', 'g', ' ', 'l' , 'o', 'v', 'e', ' ', 'd', 'o', 'g'};
	public static char[] chars4 = {'l', '\'', 'm', ' ','a', ' ', 's', 't', 'u', 'd', 'e', 'n', 't', '.'};
	
	public static void main(String[] args) {
		System.out.println(Arrays.toString(chars1));
		char[] result1 = rotatedWord1(chars1);
	    char[] result2 = rotatedWord1(chars2);
		System.out.println("第一种方法");
		System.out.println(Arrays.toString(result1));
		System.out.println(Arrays.toString(result2));
		System.out.println("第二种方法");
		rotatedWord2(chars3);
		rotatedWord2(chars4);
		System.out.println(Arrays.toString(chars3));
		System.out.println(Arrays.toString(chars4));
		
	}
	
	public static char[] rotatedWord1(char[] chars) {
		if (chars == null || chars.length == 0) {//if chars equlas {}, so chars length is 0 
			return null;
		}
		//反转所有的字符数组
		reverseChars1(chars);
		String target = String.valueOf(chars);
		String[] strings = target.split(" ");
		String result = "";
		//反转字符串数组里面的每个字符串
		for (int i = 0; i < strings.length; ++i) {
			result += i != (strings.length - 1)?(reverseString(strings[i]) + " "): reverseString(strings[i]);
		}
		char[] resultChars = result.toCharArray(); 
		return resultChars;
	}
	
	public static void rotatedWord2(char[] chars) {
		if (chars == null || chars.length == 0) {
			return;
		}
		//反转所有的字符数组
		reverseChars2(chars, 0, chars.length - 1);
		int start = -1;
		int end = -1;
		for (int i = 0; i < chars.length; i++) {
			if (chars[i] != ' ') {
				start = i == 0 || chars[i - 1] == ' '? i : start;
				end =  i == chars.length - 1 || chars[i + 1] == ' ' ? i: end;
			}
			
			if (start != -1 && end != -1) {
				reverseChars2(chars, start, end);
				start = -1;
				end = -1;
			}
		}
	} 
	
	
	//反转字符串方法
	public static String reverseString(String s){
		if (s == null || "".equals(s)) {
			return null;
		}
		String result = "";
		int length = s.length();
		for (int i = length - 1; i >= 0 ; --i) {
			result += String.valueOf(s.charAt(i));
		}
		return result;
	}
	
	//反转字符数组方法1
	public static void reverseChars1(char[] chars) {
		if (chars == null || chars.length == 0) {
			return ;
		}
		int length = chars.length;
		char temp;
		for (int i = 0; i < length / 2; ++i) {
			temp = chars[i];
			chars[i] = chars[length - 1 - i];
			chars[length - 1 - i] = temp;
		} 
	}
	
	//反转字符数组方法2
	public static void reverseChars2(char[] chars, int start, int end) {
		if (chars == null || chars.length == 0) {  
			return;
		}
		char temp;
		while (start < end) {
			temp = chars[start];
			chars[start++] = chars[end];
			chars[end--] = temp;
		}
	}
}

结果:

[p, i, g,  , l, o, v, e,  , d, o, g]
第一种方法
[d, o, g,  , l, o, v, e,  , p, i, g]
[s, t, u, d, e, n, t, .,  , a,  , l, ', m]
第二种方法
[d, o, g,  , l, o, v, e,  , p, i, g]
[s, t, u, d, e, n, t, .,  , a,  , l, ', m]


总结:

第一种方法的思想是,先反转所用字符数组,然后在把字符数组变成字符串,然后通过“ ”分割成字符串数组,然后再把字符串数组里面的每个子字符串反转,然后再拼接而成。
第二种方法思想是,先反转字符数组,然后得到反转字符数组之后,再去观察,我们需要把不是‘ ’的每个子字符数组进行反转。
例如:反转之后得到 gip sevol dog
我们需要把gip sevol dog分别进行反转,我们可以定义两个变量start和end来作为进行反转的下标
我们初始化的时候,给start和end默认是-1,这里就相当于一个反转关闭的开关,
当我们通过遍历gip sevol dog的时候,我们只有当start和end都不等于-1的时候再去反转,这里相当于一个反转打开的开关,反转之后我们就要设为start和end为-1,关闭开发
然后我们怎么知道end和start什么时候就就要进行反转操作呢?
看到gip sevol dog这个,我们需要非常敏感,chars[i-1]  == ' ' 的i的下标来作为start,然后通过char[i + 1] == ' '的i的下标来作为end同时要注意临界值。
所以我们需要得到进行切开或者分割的下标时候,我们可以和需要切开或者分割的前后字符进行比较,需要非常敏感。
相关文章
相关标签/搜索