面试编试题集锦
//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];
}
保持好奇心!

浙公网安备 33010602011771号