比较含退格的字符串
题目:给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符;注意:如果对空文本输入退格字符,文本继续为空
题目链接:力扣
思想
双指针法:采用双指针的思想,定义两个指针分别为fast和slow,fast用来遍历原数组,如果fast下标对应的字符不是'#'则将fast下标对应的字符赋值给slow下标对应的元素(slow从下标0开始),如果fast下标对应字符是'#'则需要让slow--(该操作会删除slow下标对应的字符元素),注意:对字符串的字符进行操作时需要先将字符串转换成字符数组:
public boolean backspaceCompare(String s, String t) {
char[] ch1 = s.toCharArray();
char[] ch2 = t.toCharArray();
int fast1 = 0;
int fast2 = 0;
int slow1 = 0;
int slow2 = 0;
for(fast1 = 0;fast1 < ch1.length;fast1++) {
if(ch1[fast1] != '#') {
ch1[slow1++] = ch1[fast1];
} else {
if(slow1 != 0) {
slow1--;
}
}
}
for(fast2 = 0;fast2 < ch2.length;fast2++) {
if(ch2[fast2] != '#') {
ch2[slow2++] = ch2[fast2];
} else {
if(slow2 != 0) {
slow2--;
}
}
}
String ret1 = new String(ch1,0,slow1);
String ret2 = new String(ch2,0,slow2);
return ret1.equals(ret2);
}
注意:对slow进行--操作时需要先判断一下此时slow是否为0,如果为0则需要进行--操作,为0则不进行否则会造成数组越界!
有序数组的平方
题目:给你一个按 非递减顺序 排序的整数数组
nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。题目链接:力扣
法一:使用库函数
将该数组的每一个元素进行平方的操作,再使用库函数对数组进行排序:
public int[] sortedSquares(int[] nums) {
for(int i = 0;i < nums.length;i++) {
nums[i] = nums[i] * nums[i];
}
//使用库函数对数组进行排序
Arrays.sort(nums);
return nums;
}
法二:使用排序算法(这里以冒泡排序为例)
将该数组的每一个元素进行平方的操作,再使用排序算法对数组进行排序(以冒泡排序为例):
public int[] sortedSquares(int[] nums) {
for(int i = 0;i < nums.length;i++) {
nums[i] = nums[i] * nums[i];
}
//使用冒泡排序
for(int i = 0;i < nums.length - 1;i++) {
for(int j = 0;j < nums.length - 1 - i;j++) {
if(nums[j] > nums[j+1]) {
int tmp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = tmp;
}
}
}
return nums;
}
发三:使用双指针
整个数组中若存在负数的话,则平方后的数组会呈现出先减小再增大的趋势,此时采用双指针的方法,定义一个新数组数组长度为原数组长度,并定义一个k指向新数组的最后一个元素,再分别定义一个slow指针指向数组的第一个元素,fast指针指向数组的最后一个元素,比较这两个指针所对应下标的元素,如果slow大于fast所对应元素将slow的值赋值给新数组的k下标处并且k--,否则将fast对应元素赋值给新数组的k下标处并且k--,循环终止的条件时i > j:
public int[] sortedSquares(int[] nums) {
for(int i = 0;i < nums.length;i++) {
nums[i] = nums[i] * nums[i];
}
//使用双指针
int[] ret = new int[nums.length];
int k = nums.length - 1;
int i = 0;
int j = nums.length - 1;
for(i = 0,j = nums.length - 1;i <= j;) {
if(nums[i] > nums[j]) {
ret[k--] = nums[i];
i++;
} else {
ret[k--] = nums[j];
j--;
}
}
return ret;
}
注意:
- 循环终止的条件是 i > j(i = j也要判断,否则会遗漏i = j时所对应下标的元素);
- 定义的新数组是从数组的最后一个元素开始填充数据的,所以每进行一次填充都需要将k--。