移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组
解法:使用快慢指针的思想。首先把两个指针都指向数组的第一个元素,快指针进行判断,如果该元素和val相等,说明是要被移除的元素,那么快指针往后移动一位,慢指针不动;当快指针指向的元素不等于val即不需要被移除的元素,那么我们就将该元素复制一份到慢指针指向的位置,同时快慢指针都往后移动一位。这样当快指针把所有的元素都遍历完后,慢指针所在的位置就是处理后数组的长度
class Solution {
public int removeElement(int[] nums, int val) {
int length = nums.length;
if (length == 0) {
return 0;
}
int slow = 0;
int fast = 0;
for (; fast < length; fast++) {
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
实现str
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
解法一:首先我们可以使用String类中的API完成
class Solution {
public int strStr(String haystack, String needle) {
if(haystack == null || needle ==null){
return -1;
}
//indexOf(str):返回str第一次出现的位置,没有就返回-1
return haystack.indexOf(needle);
}
}
显然这不符合我们算法的思路
解法二:我们先把这两个字符串转为字符数组,这样有助于我们进行比较。要判断后一个字符串在前一个字符串第一次出现的位置,那么后一个字符串的长度肯定是小于等于前一个字符串的。所以我们把前一个字符串的所有可能都截取出来和后一个字符串进行比较。
class Solution {
public int strStr(String haystack, String needle) {
char[] ArrayFirst = haystack.toCharArray();
char[] ArraySecond = needle.toCharArray();
int first = ArrayFirst .length;
int second= ArraySecond .length;
for (int i = 0; i +second <=first ; i++) {
Boolean flag = true;
for (int j = 0; j < second; j++) {
//比较后一个字符串中的所有字符是否相等
if (ArrayFirst [i + j] != ArraySecond [j]) {
flag = false;
break;
}
}
if (flag) {
return i;
}
}
return -1;
}
}
搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
题解:
我们可以使用二分法进行查找。先定义两个指针,左指针指向数组的第一个元素,右指针指向数组的最后一个元素。每次都找出两个指针中间的那个元素,和目标数target进行比较。如果target更大,说明target有可能在后半部分数组,那么就把左指针指向计算出来的中间位置,这样就缩小了一半的元素需要对比。如此循环,直到两个指针相遇停止判断。如果数组中有该元素target,那么左指针的位置就是target的位置,同样,如果没有该元素,target所需要插入的位置也是左指针指向的位置。
class Solution {
public int searchInsert(int[] nums, int target) {
int n = nums.length;
int l=0,r=n-1;
while(l<=r){
int mid=l+(r-l)/2;
if(nums[mid]<target)
l=mid+1;
else r=mid-1;
}
return l;
}
}