题目1:2000. 反转单词前缀
记录下标记的位置后,就从头开始交换头尾(两个指针i,idx)进行反转,
class Solution {
public String reversePrefix(String word, char ch) {
int len = word.length();
char[] arr = word.toCharArray();
int idx = 0;
for (int i = 0; i < len; i++) {
if (arr[i] == ch) {
idx = i;
break;
}
}
int i = 0;
while (i < idx) {
char temp = arr[i];
arr[i++] = arr[idx];
arr[idx--] = temp;
}
return String.valueOf(arr);
}
}
题目2:917. 仅仅反转字母
在反转之前,先判断当前字符是不是英文字符Character.isLetter(),然后再进行反转
class Solution {
public String reverseOnlyLetters(String s) {
int len = s.length();
char[] arr = s.toCharArray();
for (int i = 0, j = len - 1; i < j; ) {
while (i < j && !Character.isLetter(arr[i])) {
i++;
}
while (i < j && !Character.isLetter(arr[j])) {
j--;
}
if (i < j) {
char temp = arr[i];
arr[i++] = arr[j];
arr[j--] = temp;
}
}
return String.valueOf(arr);
}
}
题目3:475. 供暖器
两个数组都先排序好,然后针对
class Solution {
public int findRadius(int[] houses, int[] heaters) {
Arrays.sort(houses);
Arrays.sort(heaters);
int ans = 0;
for (int i = 0, j = 0; i < houses.length; i++) {
int curDistance = Math.abs(houses[i] - heaters[j]);
while (j < heaters.length - 1 && Math.abs(houses[i] - heaters[j]) >= Math.abs(houses[i] - heaters[j + 1])) {
j++;
curDistance = Math.min(curDistance, Math.abs(houses[i] - heaters[j]));
}
ans = Math.max(ans, curDistance);
}
return ans;
}
}
题目4:面试题 16.06. 最小差
这道题就是教育我们看好题目的边界条件,以及返回值的说明
class Solution {
public int smallestDifference(int[] a, int[] b) {
Arrays.sort(a);
Arrays.sort(b);
long min = Long.MAX_VALUE;
for (int i = 0, j = 0; i < a.length&&j < b.length; ) {
long minus = Math.abs((long)a[i] - (long)b[j]);
min = Math.min(min, minus);
if (a[i] > b[j]) {
j++;
} else {
i++;
}
}
return (int)min;
}
}