剑指Offer面试题(第三十四天)面试题58(1)、58(2)

     * 面试题58:翻转字符串


     * 题目一:翻转单词顺序


     * 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
     * 为简单起见,标点符号和普通字母一样处理。
     * 例如:输入字符串“I am a student.”,则输出“student. a am I”
     * 
     * 思路:
     * 1>  首先转换句子中所有的字符,此时不仅翻转了句子中单词的顺序,而且单词内的字符顺序也被翻转了。
     * 2>  然后再反转每个单词中字符的顺序,就可得到

package Test;

public class No58First_ReverseSentence {

	/*
	 * 面试题58:翻转字符串
	 * 题目一:翻转单词顺序
	 * 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
	 * 为简单起见,标点符号和普通字母一样处理。
	 * 例如:输入字符串“I am a student.”,则输出“student. a am I”
	 * 
	 * 思路:
	 * 1>  首先转换句子中所有的字符,此时不仅翻转了句子中单词的顺序,而且单词内的字符顺序也被翻转了。
	 * 2>  然后再反转每个单词中字符的顺序,就可得到
	 * 
	 * */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		No58First_ReverseSentence r = new No58First_ReverseSentence();
		String s = "I am a student.";
		System.out.println(s+"翻转句子后的结果"+r.ReverseSentence(s));
	}

	//翻转句子
	private String ReverseSentence(String s) {
		// TODO Auto-generated method stub
		if(s == null)
			return null;
		
		char[] c = s.toCharArray();
		int start = 0;
		int end = c.length - 1;
		
		//翻转整个句子
		c = Reverse(c,start,end);
		
		//翻转每个单词
		start = end = 0;
		
		while(start < c.length -1) {
			//当start指向空则 后移
			if(c[start] == ' ') {
				start++;
				end++;
			}
			else if(c[end] == ' ' || end == c.length - 1) {
				c = Reverse(c,start,--end);
				start = ++end;
			}
			else
				end++;
		}
		
		s =String.copyValueOf(c);
		return s;
	}

	//从start到end交换字符
	private char[] Reverse(char[] c, int start, int end) {
		// TODO Auto-generated method stub
		if(start >= end )
			return c;
		while(start < end) {
			char temp = c[start];
			c[start] = c[end];
			c[end] = temp;
			
			start++;
			end--;
		}
		return c;
	}
	
	

}

 * 面试题58:翻转字符串


     * 题目二:左旋转字符串


     * 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
     * 请定义一个函数实现字符串左旋转操作的功能。
     * 比如:输入字符串”abcdefg“和数字2,该函数返回左旋转两位得到的结果”cdefgab“
     * 
     * 
     * 思路:要找到左旋转时每个字符移动的规律,可以从first问题中得到启发:
     * 将字符串分为两部分:
     * 前m个字符要转移到后面,所以前面这些要转移的这些字符作为第一部分,剩下的字符作为第二部分
     * 1>  首先将两个部分的字符分别进行翻转
     * 2>  然后再对整个字符串进行翻转,然后得到左旋转m位的结果
 

package Test;

public class No58Second_LeftRotateString {

	/*
	 * 面试题58:翻转字符串
	 * 题目二:左旋转字符串
	 * 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
	 * 请定义一个函数实现字符串左旋转操作的功能。
	 * 比如:输入字符串”abcdefg“和数字2,该函数返回左旋转两位得到的结果”cdefgab“
	 * 
	 * 
	 * 思路:要找到左旋转时每个字符移动的规律,可以从first问题中得到启发:
	 * 将字符串分为两部分:
	 * 前m个字符要转移到后面,所以前面这些要转移的这些字符作为第一部分,剩下的字符作为第二部分
	 * 1>  首先将两个部分的字符分别进行翻转
	 * 2>  然后再对整个字符串进行翻转,然后得到左旋转m位的结果
	 * 
	 * */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		No58Second_LeftRotateString l = new No58Second_LeftRotateString();
		String s = "abcdefg";
		int m = -1;
		System.out.println("左旋转字符串"+m+"位:"+l.LeftRotateString(s,m));
	}

	//左旋转操作
	private String LeftRotateString(String s, int m) {
		// TODO Auto-generated method stub
		if(s == null || m <= 0 ||m > s.length())
			return null;
		
		char[] c = s.toCharArray();
		
		c = Reverse(c,0,m-1);
		c = Reverse(c,m,c.length - 1);
		c = Reverse(c,0,c.length - 1);		
		return String.copyValueOf(c);
	}
	
	//从start到end对字符串进行翻转
	public char[] Reverse(char[] c,int start,int end) {
		if(start >= end || c == null)
			return c;
		
		while(start < end) {
			char temp = c[start];
			c[start] = c[end];
			c[end] = temp;
			end--;
			start++;
		}
		
		return c;
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_43137176/article/details/89786095