1. 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
测试样例:
[1,3,5,7,9],5,3
返回:1
不一样的地方就是要返回第一次出现的位置
我先用了递归做还加了指针,然后超出内存,然后改成了非递归,然后超时,再然后就是改成了如果中间值小于等于val就只查找左半部分.......然后通过了,
class BinarySearch { public: int getPos(vector<int> A, int n, int val) { // write code here int min = n; int l = 0, r = n - 1; while (l <= r) { int mid = l + (r - l) / 2; if (A[mid] >= val) { if (mid < min) { min = mid; r = mid - 1; } } else l = mid + 1; } if (min == n) return -1; else { return min; } } };
2. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。
给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。
测试样例:
"qywyer23tdd",11
返回:y
class FirstRepeat { public: char findFirstRepeat(string A, int n) { // write code here vector<int> vec(123); int length = A.length(); for (int i = 0; i < length; i++) { int t = (int)A[i]; vec[t]++; if (vec[t] > 1) { return A[i]; break; } } return 0; } };
3. 请设计一个高效算法,再给定的字符串数组中,找到包含"Coder"的字符串(不区分大小写),并将其作为一个新的数组返回。结果字符串的顺序按照"Coder"出现的次数递减排列,若两个串中"Coder"出现的次数相同,则保持他们在原数组中的位置关系。
给定一个字符串数组A和它的大小n,请返回结果数组。保证原数组大小小于等于300,其中每个串的长度小于等于200。同时保证一定存在包含coder的字符串。
测试样例:
["i am a coder","Coder Coder","Code"],3
返回:["Coder Coder","i am a coder"]
其实很想用正则去匹配的,但是没有regex这个头文件给我用,所以只能一个一个判断了,然后用了插入排序,交换字符串........
class Coder { public: int regex(string str) { int i = 0; int count = 0; int len = str.length(); while (i<len) { if ((str[i] == 'C' || str[i] == 'c') && (str[i + 1] == 'O' || str[i + 1] == 'o') && (str[i + 2] == 'D' || str[i + 2] == 'd') && (str[i + 3] == 'E' || str[i + 3] == 'e') && (str[i + 4] == 'R' || str[i + 4] == 'r')) { i += 5; count++; } else i++; } return count; } vector<string> findCoder(vector<string> A, int n) { // write code here vector<int> vec(n); for (int i = 0; i < n; i++) { string str = A[i]; int count = regex(A[i]); vec[i] = count; } for (int i = 0; i < n; i++) cout << vec[i] << " "; for (int i = 1; i < n; i++) { string temp = A[i];int j = 0; for (j = i; j > 0 && a > vec[j - 1]; j--) { A[j] = A[j - 1]; } A[j] = temp; } return A; } };