[蓝蓝计算机考研算法]-day20搜索目标值&&原地修改数组

50 阅读1分钟

搜索目标值

给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。

提示:

  • 你可以假设nums中的所有元素是不重复的。

  • n 将在 [1, 10000]之间。

  • nums的每个元素都将在 [-9999, 9999]之间。

示例

输入
-1 0 3 5 9 12
9 
输出
4

输入
-1 0 3 5 9 12
2 
输出
-1 

思路

  • 输入数组和目标值,然后循环遍历数组,看其值是否等于目标值,若相等,则输出下标,结束循环;不相等,继续循环。

  • 用一个信号量flag判断是否找到目标值,并设初始值为0。当找到下标时,设置为1。最后对flag判断,若flag=0,表示未找到目标值,则输出-1。

具体实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[100];
	int x,n=0,target;
	int flag=0; //设置一个信号量用来判断是否已找到目标值 
	while(cin>>x){ //输入数组 
		a[n++]=x;
		if(cin.get()=='\n') break;
	}
	cin>>target; //输入目标值 
	
	for(int i=0; i<n; i++){
		if(a[i]==target){
			cout<<i;
			flag=1; //赋值为1表示已找到 
			break;
		}else{
			continue; //没找到,继续循环 
		}
	} 
	if(flag==0) cout<<-1; //若目标值为0,则未找到,输出-1 
	return 0;
} 

原地修改数组

给你一个数组nums和一个值val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变,不需要考虑数组中超出新长度后面的元素。

例如:给定nums=[0,1,2,2,3,0,4,2],val=2,函数应该返回新的长度5,并且nums中的前五个元素为 0, 1, 3, 0, 4。 你不需要考虑数组中超出新长度后面的元素。

示例

输入
3 2 2 3
3
输出
2

思路

  • 首先输入数组元素和val,定义一个cnt值,并赋值为0,用来计算元素个数,即数组长度。

  • 然后遍历数组,当元素值与val不同时,cnt++,当元素值与val值相同时,继续遍历。

  • 最后输出cnt,即数组新长度。

具体实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[100],x,val,n=0,cnt=0;
	while(cin>>x){ //输入数组元素 
		a[n++]=x;
		if(cin.get()=='\n') break;
	}
	cin>>val; //输入要删除的val值
	for(int i=0; i<n; i++){
		if(a[i]==val){
			continue;
		}else{
			cnt++;
		}
	} 
	cout<<cnt;//输出数组长度 
	return 0;
} 

小结

两道题都用到了break和continue,那就再强调一下break和continue的用法吧。 break,结束循环;continue,结束本次循环,进行下一次循环。