RNG输了,但我们不能输

2023-10-13 07:10
文章标签 不能 rng

本文主要是介绍RNG输了,但我们不能输,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

RNG输了,输在了轻敌,没有把G2当人看,随随便便bp,就是告诉你,我4保1奥巴马我也可以赢,结果啪啪啪打脸。

我们从这件事中得到的教训就是不要膨胀,不管面试中出的题多么简单,都要去认真对待,切不可轻敌,留下遗憾啊!

在我面过的公司里面,去哪儿、秒针、猎豹、作业帮等公司都考察了二分查找,去哪儿在实习和秋招都考察了二分查找。

对于一个简简单单的二分查找,你真的能完全写对吗?越是面试中考察简单的东西,越需要花点心思去搞明白~

概念介绍

什么是二分查找

维基百科

在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

案例1

题目

去哪儿/一点咨讯 手写代码题:

对于一个排序数组,无重复数字,给定一个数target,如果这个数target存在,那么返回它出现的下标,如果不存在返回-1。

错误示例

一些朋友看到这题,心里道:“乔兄,这也太简单了吧!”。完全有把这道理放在眼里,十分膨胀,话语刚落,已经开始在编辑器花了5分钟刷刷地写了出来。

“乔兄,我写完了,你看!”

代码:

  1. class Solution {

  2.    public int search(int[] nums, int target) {

  3.        int left = 0;

  4.        int right = nums.length - 1;

  5.        if(nums.length == 0)

  6.            return -1;

  7.        while(left <= right)

  8.        {

  9.            int mid = (left + right) / 2;//标记

  10.            if(nums[mid] > target)

  11.                right = mid - 1;

  12.            else if(nums[mid] < target)

  13.                left = mid + 1;

  14.            else{

  15.                return mid;

  16.            }

  17.        }

  18.        return -1;

  19.    }

  20. }

上述代码,在数据量比较低的情况下是没有问题的,但是当数据量非常大,比如说nums这个数目的长度是int的最大值2147483647,而我们要找的数刚好在数组的右半部分,那么left大于1/2(int 最大值),right的值大于1/2(int的最大值),此刻在求mid = (left + right)/2的时候就会产生溢出,大于整数的最大值,进而产生错误!!!

如何改进

  • long mid = (left + right) / 2; //将mid的值的类型设置为long;

  • int mid = left + (right-left)/2;//推荐这种写法,这种写法的意思就是用右边界的值减去左边界的值,得到差值,然后左边界的值加上差值的1/2就是mid值~

一道简单的二分查找,但可千万别小看,面试官越是问的简单的手写代码题,越要看仔细了,越是简单,越有可能阴沟里翻船!

案例2

题目

百度一面面试题:

求二叉树中的最小深度

示例

深度是按照一层一层来进行计数的,根结点A的深度就是1,再往下一层(B,C所在的层)的话深度就是2。

下图中的二叉树的最小深度(D,E,F,G所在的层)就是3,A代表的是根结点,G,I,E,F,G代表的是叶子节点。

640?wx_fmt=jpeg

下图中的二叉树的最小深度(B,C所在的层)就是2,A代表根结点,C,E,G,I代表的是叶子节点。

640?wx_fmt=jpeg

错误示范

当时我一看这题感觉是送分题啊,我拿起笔很快地就写了出来。

思路:递归的思路,就是每次找每个节点的最小深度,最开始是去寻找叶子节点的最小深度,然后叶子节点的最小深度知道了以后,就得到了叶子节点的父亲节点的最小深度,这样一层层回溯的过程就把每个节点所代表的二叉树的最小深度知道了,最后根结点代表的二叉树的最小深度就知道了。

代码:

  1. public class Solution {

  2.    public int minDepth(TreeNode root) {

  3.        if(root == null) return 0;

  4.        int left = minDepth(root.left);

  5.        int right = minDepth(root.right);

  6.        if(left == 0 || right == 0)

  7.            return left+right+1;

  8.        //左子树或者右子树有一个为空

  9.        //left为0直接返回右子树的最小深度+1

  10.        else

  11.            return Math.min(left,right)+1;

  12.        //左右子树都不为空,返回高度较小的

  13.    }

  14. }

写完以后,我觉得没什么问题,就让百度的面试官去看了,面试官看了以后说,“写的挺好,但是如果当这个树的节点数目非常大的时候,是不是效率上会慢一些,有没有什么改进方法?”

我恍然大悟,我说咋出这么简单的题,原来是考察在大数据的情况下的最优解,怪就怪在我自我膨胀了,没认真对待面试官出的这道题。

如何改进

我上述的代码是在小数据的情况下,是OK的,在大数据的情况下,需要遍历的时候,按照层次遍历的思路,找到第一个叶子节点,然后就结束遍历了,无需再进行遍历,因为题目是最小深度,所以已经找到了,就结束返回结果就完事了,还遍历干啥?

代码:

  1. class Solution {

  2.    public int minDepth(TreeNode root) {

  3.        int level = 1;//深度

  4.        int toBePrinted = 1;

  5.        //接下来要打印的节点个数

  6.        int nextLevelNumber = 0;

  7.        //下一层节点的数目

  8.        if(root == null)

  9.            return 0;

  10.        Queue<TreeNode> queue

  11.        = new LinkedList<>();

  12.        //用一个队列存节点

  13.        queue.add(root);

  14.        while(!queue.isEmpty())

  15.        {

  16.            TreeNode temp = queue.poll();

  17.            toBePrinted--;

  18.            if(temp.left == null

  19.              && temp.right == null)

  20.            {//找到叶子节点

  21.             //就返回当前的层数就是最小深度

  22.                return level;

  23.            }

  24.            if(temp.left != null)

  25.            {

  26.                queue.add(temp.left);

  27.                nextLevelNumber++;

  28.            }

  29.            if(temp.right != null)

  30.            {

  31.                queue.add(temp.right);

  32.                nextLevelNumber++;

  33.            }

  34.            if(toBePrinted == 0)

  35.            {//上一层节点遍历完了

  36.             //层数加1,并将计数的

  37.             //nextLevelNumber置位0

  38.             //toBePrinted 是下一层

  39.             //要打印的节点数目

  40.                toBePrinted = nextLevelNumber;

  41.                nextLevelNumber = 0;

  42.                level++;

  43.            }

  44.        }

  45.        return level;

  46.    }

  47. }

结束语

面试中遇到的任何的问题,都不可以掉以轻心,不要膨胀,稳扎稳打,持之以恒,不懈努力,那么相信offer在向你招手。

RNG输了,我们不能输!加油!

END

推荐阅读

三位斩获百度C++后台开发offer大佬的口述分享!!!

我的2019校招

极有可能是你朋友圈最全的3T编程资料分享!!!

640?wx_fmt=png

这篇关于RNG输了,但我们不能输的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/201593

相关文章

python 在pycharm下能导入外面的模块,到terminal下就不能导入

项目结构如下,在ic2ctw.py 中导入util,在pycharm下不报错,但是到terminal下运行报错  File "deal_data/ic2ctw.py", line 3, in <module>     import util 解决方案: 暂时方案:在终端下:export PYTHONPATH=/Users/fujingling/PycharmProjects/PSENe

java编程:命令行输入的三个整数判断是否构成三角形,不能就抛异常。

写一个方法void sanjiao(int a,int b,int c),判断三个参数是否能构成一个三角形,如果不能则抛出 异常IllegalArgumentException,显示异常信息“a,b,c不能构成三角形”, 如果可以构成则显示三角形三个边长,在主方法中得到命令行输入的三个整数,调用此方法,并捕获异常。 附源代码: package 异常;public class Sa

虚拟机不能联网的问题

如果虚拟机在NAT模式下不能联网的话,有可能是你的计算机服务里面的VMwareNAT service,VMware DHCP Service没启动。

https://curl.trillworks.com不能用的解决方法

gitee源码:https://gitee.com/Project0ne/curlconverter 首先打开上面的链接 然后下载文件 下载文件到本地 然后安装node.js(Node.js official website.)不会的自行百度,这里不做过多赘述。 在curlconverter文件夹下面打开终端(在文件夹下面右键-在终端打开) 输入 npm init -y 然后安装curl

【Java】Hashmap不能用基本的数据类型 Dimensions expected after this token

http://moto0421.iteye.com/blog/1143777 今天试了一下HahsMap, 采用如下形似定义 (这个下面是用了csdn的一位同仁的文章,仅作为讲解参考,请见谅) HashMap<int,String> map=new HashMap<int,String>();  map.put(1,"a");  map.put(2,"b");  map.pu

技术师增强版,系统级别的工具!【不能用】

数据安全是每位计算机用户都关心的重要问题。在日常使用中,我们经常面临文件丢失、系统崩溃或病毒感染等风险。为了解决这些问题,我们需要可靠且高效的数据备份与恢复工具。本文将介绍一款优秀的备份软件:傲梅轻松备份技术师增强版,它可以为Windows操作系统用户提供了全面的数据保护解决方案。 傲梅轻松备份技术师增强版是由傲梅官方推出的一款专业备份工具。它以业界领先的备份速度和用户友好的操作界面著称,为

Android不能调用java.awt的原因及解决办法和思考

android 里面不能使用awt,底层没有具体的实现awt android里面的窗口创建过程决定了界面只能是android里面的组建。 android的组件都是通过远程的IPC调用完成的,也就是说服务端有什么功能才能用什么功能。 不是所有用java写的程序都能在标准jvm中运行的。 android中的虚拟机是修改过的,跟标准的JVM不同,比如对一张图片的解析,android

程序员为什么不能一次性写好,需要一直改Bug?

程序员在编写代码时不能一次性写好,而是需要不断修改Bug,这主要是由几个因素导致的: 复杂性:软件开发是一个高度复杂的过程,涉及到多个模块、功能、逻辑和数据的交互。即使是最有经验的程序员,也很难一次性预见并处理所有可能出现的问题。需求变更:在软件开发过程中,客户需求经常会发生变化。这些变更可能导致已经编写好的代码需要调整,从而引入新的Bug。技术更新:随着技术的不断发展,新的编程语言、框架和库不

如何设置电脑不能访问公网但是能够访问内网

如何设置电脑不能访问公网但是能够访问内网 方法: 删除本地路由 手动添加只能访问内网的路由 首先查看本地路由 打开cmd 输入 ipconfig /all 通常默认网关对应的路由即是默认路由 查看路由route print,红框内即为默认路由 删除默认路由route delete 网段 再查看路由,已经删除了 添加只能访问内网的路由,随便找一个只能访问内网的路由即