面试编试题集锦

//Leetcode151   翻转字符串里面的单词
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"));
	}
}




//Leetcode3  无重复字符的最长子串
 public int lengthOfLongestSubstring(String s) {
		if( s == null) return 0;
		
		char[] chars = s.toCharArray();
		if(chars.length == 0 ) return 0;
		int[] preIdxes =  new int[128];
        for(int i = 0 ; i < preIdxes.length; i++)
		{
			preIdxes[i] = -1;
		}
		preIdxes[chars[0]] = 0;
		
		//以i-1位置字符结尾的最长不重复字符串的开始索引 最左索引
		int li = 0;
		int max = 1 ;
		for(int i  = 1; i < chars.length ; i++)
		{
		
			int  pi = preIdxes[chars[i]];
			
			if(li <= pi)
			{
				li = pi + 1;
			}
			preIdxes[chars[i]] = i;
			
			max = Math.max(max, i - li + 1);
		}
		
		return max;
	}

//剑指offer 47 礼物的最大价值
	public int maxValue(int [][] grid)
	{
		int rows = grid.length;
		int cols = grid[0].length;
		
		int [][] dp = new int[rows][cols];
		dp[0][0] = grid[0][0];
		//第0行
		for(int col = 1 ; col < cols; col++)
		{
			dp[0][col] = dp[0][col-1] + grid[0][col];
		}
		//第0列
		for(int row = 1 ; row < rows; row++)
		{
			dp[row][0] = dp[row-1][0] + grid[row][0];
		}
		
		for(int row = 1 ; row < rows; row++ )
		{
			for(int col = 1 ; col <  cols  ; col++)
			{
				dp[row][col]  = Math.max(dp[row-1][col], dp[row][col-1]) + grid[row][col];
			}
		}
			
			
		return dp[rows-1][cols-1];
	}

posted @ 2020-08-04 20:33  Akmf's_blog  阅读(67)  评论(0)    收藏  举报