问题一:将一个字符串中的空格替换成 "%20"
算法描述:
-
p1为字符串长度减1;
-
从字符串头字符遍历至尾字符,若有空格字符,则在字符串尾部添加两个字符;
-
p2为操作后字符串的长度减1;
-
p1为原字符串长度减1,将字符串从p1位置遍历至头字符,若该位置非空格,则将该位置字符复制至p2位置;若为空格,则在p2-2、p2-1、p2位置置为%20;
-
遍历运行至p1<0或p1==p2。
代码如下:
public String replaceSpace(StringBuffer str) {
int P1 = str.length() - 1;
for (int i = 0; i <= P1; i++)
if (str.charAt(i) == ' ')
str.append(" ");
int P2 = str.length() - 1;
while (P1 >= 0 && P2 > P1) {
char c = str.charAt(P1--);
if (c == ' ') {
str.setCharAt(P2--, '0');
str.setCharAt(P2--, '2');
str.setCharAt(P2--, '%');
} else {
str.setCharAt(P2--, c);
}
}
return str.toString();
}
问题二:给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。
Consider the following matrix:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
Given target = 5, return true.
Given target = 20, return false.
这个问题如果从第一行第一列元素着手,很难找到解决方案;如果从右上角元素开始,问题就迎刃而解了。
算法描述:
-
从右上角元素开始,如果目标元素小于该元素,则将游标向左移动一位;如果目标元素大于该元素,则将游标向下移动一位;如果相等,则返回true;
-
迭代;
-
如果遍历整个二维数组均找不到和目标元素相等的元素,则返回false。
代码如下:
public boolean Find(int target, int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
return false;
int rows = matrix.length, cols = matrix[0].length;
int r = 0, c = cols - 1; // 从右上角开始
while (r <= rows - 1 && c >= 0) {
if (target == matrix[r][c])
return true;
else if (target > matrix[r][c])
r++;
else
c--;
}
return false;
}
问题三:在一个字符串中找到第一个只出现一次的字符,并返回它的位置。字符串只包含 ASCII 码字符。
Input: abacc
Output: b
算法描述:
-
创建一个有128元素(代表128个ASCII 码字符)的整型空数组cnts;
-
遍历字符串,将字符串的每个字符对应的ASCII值作为cnts的下标,该下标的值每次加1;
-
从头至尾遍历数组cnts,找到值为1的元素,返回该元素在字符串中的位置。如找不到,返回-1。
代码如下:
public int FirstNotRepeatingChar(String str) {
int[] cnts = new int[128];
for (int i = 0; i < str.length(); i++)
cnts[str.charAt(i)]++;
for (int i = 0; i < str.length(); i++)
if (cnts[str.charAt(i)] == 1)
return i;
return -1;
}
注:凡属于本公众号内容,未经允许不得私自转载,否则将依法追究侵权责任。