字节跳动最新简单算法面试题

eab5f8edb88ebe9f29f748d2ea51d040.gif

关注上方程序员小熊,回复算法、python、cpp、C++、512和1024,即可获取海量学习资料!

前言

大家好,我是熊哥。最近一位朋友去面试了字节跳动的后台开发的岗位,其一面的算法题,个人感觉比较简单。

分享一下,供大家参考,大家看看难不难,希望能对大家学习和找工作有所帮助。

查找最大值

有一个整型数组,数组元素不重复,数组元素先升序后降序,

例如:1,3,5,7,9,8,6,4,2,请写一个函数找出数组最大的元素。
5b3bd185063994b740db0f0cc2aa8a03.png
原题

解题思路

咋一看本题,大家都会觉得很简单。很容易想到如下两种思路:

思路一:对数组按照从大到小或从小到大进行排序,那么第一个元素或最后一个元素就是最大的元素。

思路二:遍历整个数组,设置最大元素为第一个元素,边遍历边比较,同时更新最大元素。

尽管上述两种方法都可以,前者如果用快排的时间复杂度为O(nlgn),后者时间复杂度为O(n),其中 n 是数组的长度,但这样做,面试官可能就会让你回去等答复

二分查找

本题可以采用二分法去做。原因:数组一端升序另一端降序。只要找到升序一端的最后一个元素即可。

示例

以 nums = {7, 8, 6, 5, 4}为例,如下图示:

e9c782302ebb21963a1903c1ceff7f92.png
例子
  1. 由于数组是先升后降,所以第一个元素或最后一个元素不可能是最大元素,查找区间可设定为[1, numsSize - 2]。

7def992273dfe395808de75e1b958c61.png
设置查找区间
  1. 比较中间元素与其下一个元素大小关系,缩小目标值的查找区间。

808da1c4800837b0baf8f079185b6b6b.png
缩小目标值的查找区间
78562e110bacb01dd35f23ab11ddb39c.png
继续缩小查找区间
  1. 获取升序的一端的最后一个元素(目标值)。

4fa3ed984a00818e3c9c648e258dff7f.png
获取目标值

注意

由于题目已提示数组元素不重复,因此不需要考虑有相同元素的情况。

Show me the Code

C

int getLargestNumInArray(int *nums, int numsSize) {
    if (nums == NULL || numsSize <= 0) {
        return -1;
    }

    int left = 1, right = numsSize - 2;
    while (left <= right) {
        int mid = left + ((right - left) >> 1);
        if (nums[mid] < nums[mid + 1]) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }

    }

    return nums[left];
}

复杂度分析

时间复杂度O(lgn),其中 n 为数组的长度;

空间复杂度O(1),未开辟额外存储空间。

往期精彩回顾

快手最新面试真题

阿里云最新面试真题

阿里菜鸟网络一面最新笔试题

vivo 服务器开发工程师面试题

决定你是否能进字节的几道题

微信信用卡还款后台开发最新面试真题

更多精彩

关注公众号程序员小熊

e29b53628b96622a6ece9d0e7808b06c.png
微信公众号

点“赞”和“在看”哦f0d2e9e4724525be7fba921a76e96f6e.gif

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值