1. 用二分法在一升阶整形数组中查找目标数,找到返回其下标值。
下边是我写的代码:
#include <iostream>
#include <vector>
using namespace std;
class Dichotomy {
public:
int a;
int search_target_in_array(vector<int>& arr, int target)
{
int left = 0;
int right = arr.size() - 1;
while (left <= right)
{
int middle = left + (right - left) / 2; //这个位置之前在循环外加的,且没有加left.
if (arr[middle] > target)
{
right = middle - 1;
}
else if (arr[middle] < target)
{
left = middle + 1;
}
else
{
cout << middle << endl;
return middle;
}
}
cout << "-1" << endl;
return -1;
}
};
int main()
{
class Dichotomy A;
vector<int> arr;
int input_num = 0;
int target = 0;
cout << "please a array first"<<endl;
for (int i = 0; i < 5; i++)
{
cin >> input_num;
arr.push_back(input_num);
}
cout << "secondly input a target" << endl;
cin >> target;
int ret = 0;
ret = A.search_target_in_array(arr, target);
cout << "result: " << ret << endl;
return 0;
}
这句是我出错的地方,我竟然把取中间值的下标放在了循环外,导致我排查了半天,最后对比卡哥代码发现不对,该过来就好了;另外还有在除二的时候一定要加上left,也就是左边界,因为减完后就是个基于左边界的偏移量,如果不加,这个偏移量将没有意义。
2. 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。(不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。)
class DoublePointer {
public:
int a;
int remove_target_from_array(vector<int>& arr, int target) {
int slow = 0;
int fast = 0;
for (fast = 0; fast < arr.size(); fast++) {
if (arr[fast] != target) {
arr[slow] = arr[fast];
slow++;
}
}
return slow;
}
};
自己写的时候,写成了fast = slow + 1;导致快指针从数组第二个开始遍历,破坏了完整性。