去哪儿笔试的三个编程题

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;
    }
    
};

 


posted @ 2018-03-13 23:12  -桃之夭夭  阅读(199)  评论(0编辑  收藏  举报