剑指offer-搜索算法

1.数字在升序数组中出现的次数

实现函数lower_boundupper_bound

    int GetNumberOfK(vector<int> nums ,int k) {
        if (nums.empty()) return 0;
        int n = nums.size();
        int l = 0, r = n - 1;
        while (l < r) {
            int mid = l + r >> 1;
            if (nums[mid] < k) l = mid + 1;
            else r = mid;
        }
        int idx1 = l;
        if (nums[l] != k) return 0;
        l = 0, r = n - 1;
        while (l < r) {
            int mid = l + r + 1 >> 1;
            if (nums[mid] > k) r = mid - 1;
            else l = mid;
        }
        int idx2 = l;
        return idx2 - idx1 + 1;
    }

2.二维数组中的查找

    bool Find(int target, vector<vector<int> > array) {
        if (array.empty()) return false;
        int m = array.size(), n = array[0].size();
        int i = 0, j = n - 1;
        while (i < m and j >= 0) {
            if (target == array[i][j]) return true;
            else if (target < array[i][j]) --j;
            else ++i;
        }
        return false;
    }

3.旋转数组的最小数字

    int minNumberInRotateArray(vector<int> rotateArray) {
        int l = 0, r = rotateArray.size() - 1;
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (rotateArray[mid] < rotateArray[r]) r = mid;
            else if (rotateArray[mid] > rotateArray[r]) l = mid + 1;
            else --r;
        }
        return rotateArray[l];
    }

4.字符串排列

class Solution {
    set<string> res;
    void dfs(int idx, string& str) {
        if (idx == str.size() - 1) {
            res.insert(str);
            return;
        }
        for (int i = idx; i < str.size(); ++i) {
            swap(str[idx], str[i]);
            dfs(idx + 1, str);
            swap(str[idx], str[i]);
        }
    }
public:
    vector<string> Permutation(string str) {
        dfs(0, str);
        return vector<string>(res.begin(), res.end());
    }
};

5.数字序列中的某一位数字

挺难的...

    int findNthDigit(int n) {
        //只有一位,一位数有9个,一位的基数是1,n是剩余的位数
        long long i = 1, s = 9, base = 1;
        while (n > i * s) {
            n -= i * s;
            ++i;
            s *= 10;
            base *= 10;
        }
        int num = base + (n + i - 1) / i - 1;
        int rest = n % i ? n % i : i;
        for (int j = 0; j < i - rest; ++j) {
            num /= 10;
        }
        return num % 10;
    }
全部评论

相关推荐

会飞的猿:我看你想进大厂,我给你总结一下学习路线吧,java语言方面常规八股要熟,那些java的集合,重点背hashmap八股吧,jvm类加载机制,运行时分区,垃圾回收算法,垃圾回收器CMS、G1这些,各种乐观锁悲观锁,线程安全,threadlocal这些。在进阶一些的比如jvm参数,内存溢出泄漏排查,jvm调优。我这里说的只是冰山一角,详细八股可以去网上找,这不用去买,都免费资源。mysql、redis可以去看小林coding,我看你简历上写了,你一定要熟,什么底层b+树、索引结构、innodb、mvcc、undo log、redo log、行级锁表级锁,这些东西高频出现,如果面试官问我这些我都能笑出来。消息队列rabbitmq也好kafka也好,学一种就行,什么分区啊副本啊确认机制啊怎么保证不重复消费、怎么保证消息不丢失这些基本的一定要会,进阶一点的比如LEO、高水位线、kafka和rocketmq底层零拷贝的区别等等。计算机网络和操作系统既然你是科班应该理解起来问题不大,去看小林coding这两块吧,深度够了。spring boot的八股好好看看吧,一般字节腾讯不这么问,其他的java大厂挺爱问的,什么循环依赖啥的去网上看看。数据结构的话科班应该问题不大,多去力扣集中突击刷题吧。项目的话其实说白了还是结合八股来,想一想你写的这些技术会给你挖什么坑。除此之外,还有场景题、rpc、设计模式、linux命令、ddd等。不会的就别往简历上写了,虽然技术栈很多的话好看些,但背起来确实累。总结一下,多去实习吧,多跳槽,直到跳到一个不错的中厂做跳板,这是一条可行的进大厂的路线。另外,只想找个小厂的工作的话,没必要全都照这些准备,太累了,重点放在框架的使用和一些基础八股吧。大致路线就这样,没啥太多难度,就是量大,你能达到什么高度取决于你对自己多狠,祝好。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务