1. 程式人生 > 實用技巧 >面試編試題集錦

面試編試題集錦

public class Leetcode151 {
	public static  String reverseWords(String s)
	{
		if(s == null)
			return null;
		
		char[] chars = s.toCharArray();
		
		//消除多餘的空格
		int len = 0; //字串的有效長度
		int cur = 0; //當前用來存放字元的位置
		boolean space = true ;//前一個字元是否為空格字元
		for (int i = 0; i < chars.length; i++) {
			if(chars[i] != ' ')
			{
				chars[cur++] =  chars[i];
				space = false;
			}else if(space == false){ //chars[i]是空格字元 並且上一個chars[i-1]是非空格字元
				chars[cur++] = ' ';
				space = true;
			}
		}
		
		len = space ? (cur-1) : cur;
		if(len <= 0 ) return "";
		
		//翻轉
		//先逆序  然後再對每一個單詞逆序
		reverse(chars, 0, len);
		
		//對前一個單詞進行逆序(哨兵)
		int preSpaceIdx = -1 ;
		for(int i = 0 ; i < len; i++)
		{
			if(chars[i] != ' ') continue;
			
			//i 是空格的位置
			reverse(chars, preSpaceIdx+1, i);
			preSpaceIdx = i;
		}
		reverse(chars, preSpaceIdx+1, len);
		
		return new String(chars,0,len);
	}
	
	//逆序 [L,r)
	private static void reverse(char[] chars,int l,int r)
	{
		r--;
		while(l < r)
		{
			char tmp = chars[l];
			chars[l] =  chars[r];
			chars[r] = tmp;
			l++;
			r--;
		}
	}
	
	
	
	
	public static void main(String[] args) {
		System.out.println(reverseWords("  are you ok "));
		System.out.println(reverseWords("  hello world!       "));
		System.out.println(reverseWords("a good   example"));
	}
}