二分查找:
题目描述
对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
测试样例:
[1,3,5,7,9],5,3
返回:1
分析:题目比较简单就是一道简单的二分查找的题,定义,low,high,mid;进行循环的判断,唯一不同的是,若关键值出现多次要求输出第一次出现的位置,很简单,只需要在找到的时候,看一下在此之前有没有相同的值,话不多说上代码。
代码:
class BinarySearch {
public:
int getPos(vector<int> A, int n, int val) {
// write code here
int i;
int low=0;
int high=n-1;
int mid=(low+high)/2;
int temp=n;
while(low<=high){
if(A[mid]<val){
low=mid+1;
mid=(low+high)/2;
}else if(A[mid]>val){
high=mid-1;
mid=(low+high)/2;
}else{
for(int j=0;j<=mid;j++){ //循环mid之前的数组,如果有相同的直接输出即可
if(A[j]==A[mid]){
return j;
}
}
}
}
return -1;
}
字符串查找:
题目描述
对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。
给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。
测试样例:
"qywyer23tdd",11
返回:y
分析:一道简单的字符串问题,找到第一次重复出现的字符,一开始我想知道长度可以直接循环查找
class FirstRepeat {
public:
char findFirstRepeat(string A, int n) {
// write code here
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(A[i]==A[j]){
return A[i];
}
}
}
return -1;
}
};
后来我才发现是我理解错了题意,他要找的是首先出现重复的一对,而不是第一个,所以所以需要记录一下前面反复问的内容才可以,所以做了以下改进,使用辅助空间完成
代码:
class FirstRepeat {
public:
char findFirstRepeat(string A, int n) {
// write code here
int a[500]={0};
for(int i=0;i<n;i++){
int num=A[i];
if(a[num]==0){
a[num]++;
}else{
return A[i];
}
}
return -1;
}
};
个人觉得不是最好的方法,欢迎评论。