• 去哪儿笔试的三个编程题


    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;
        }
        
    };
    
    
  • 相关阅读:
    iOS各种证书
    Error No matching provisioning profiles found
    iOS 一个开发者账号 多台Mac 共用
    外中断(学习汇编)
    端口(学习汇编)
    8086CPU寄存器
    int指令(学习汇编)
    内中断(学习汇编)
    标志寄存器(学习汇编)
    CALL和RET指令(学习汇编)
  • 原文地址:https://www.cnblogs.com/MoisAbby/p/8563621.html
Copyright © 2020-2023  润新知