首页 > 编程语言 >#yyds干货盘点# LeetCode程序员面试金典:两数相除

#yyds干货盘点# LeetCode程序员面试金典:两数相除

时间:2023-04-18 22:34:13浏览次数:51  
标签:yyds return divisor int 金典 相除 add Integer dividend

题目:

给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

返回被除数 dividend 除以除数 divisor 得到的 商 。

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231,  231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

 

示例 1:

输入: dividend = 10, divisor = 3

输出: 3

解释: 10/3 = 3.33333.. ,向零截断后得到 3 。

示例 2:

输入: dividend = 7, divisor = -3

输出: -2

解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。

代码实现:

class Solution {
    public int divide(int dividend, int divisor) {
        // 考虑被除数为最小值的情况
        if (dividend == Integer.MIN_VALUE) {
            if (divisor == 1) {
                return Integer.MIN_VALUE;
            }
            if (divisor == -1) {
                return Integer.MAX_VALUE;
            }
        }
        // 考虑除数为最小值的情况
        if (divisor == Integer.MIN_VALUE) {
            return dividend == Integer.MIN_VALUE ? 1 : 0;
        }
        // 考虑被除数为 0 的情况
        if (dividend == 0) {
            return 0;
        }
        
        // 一般情况,使用二分查找
        // 将所有的正数取相反数,这样就只需要考虑一种情况
        boolean rev = false;
        if (dividend > 0) {
            dividend = -dividend;
            rev = !rev;
        }
        if (divisor > 0) {
            divisor = -divisor;
            rev = !rev;
        }
        
        int left = 1, right = Integer.MAX_VALUE, ans = 0;
        while (left <= right) {
            // 注意溢出,并且不能使用除法
            int mid = left + ((right - left) >> 1);
            boolean check = quickAdd(divisor, mid, dividend);
            if (check) {
                ans = mid;
                // 注意溢出
                if (mid == Integer.MAX_VALUE) {
                    break;
                }
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        return rev ? -ans : ans;
    }

    // 快速乘
    public boolean quickAdd(int y, int z, int x) {
        // x 和 y 是负数,z 是正数
        // 需要判断 z * y >= x 是否成立
        int result = 0, add = y;
        while (z != 0) {
            if ((z & 1) != 0) {
                // 需要保证 result + add >= x
                if (result < x - add) {
                    return false;
                }
                result += add;
            }
            if (z != 1) {
                // 需要保证 add + add >= x
                if (add < x - add) {
                    return false;
                }
                add += add;
            }
            // 不能使用除法
            z >>= 1;
        }
        return true;
    }
}

标签:yyds,return,divisor,int,金典,相除,add,Integer,dividend
From: https://blog.51cto.com/u_13321676/6204101

相关文章

  • #yyds干货盘点# LeetCode面试题:删除有序数组中的重复项 II
    1.简述:给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。 说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数......
  • # yyds干货盘点 # Pandas另存为excel的时候我想从B列开始存储,不想要A列,应该怎么处理呢
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【eric】问了一个Pandas的问题,这里拿出来给大家分享下。另存为excel的时候我想从B列开始存储,不想要A列,应该怎么处理呢?另存为excel的时候我想从B列开始存储,不想要A列,应该怎么处理呢?我看start_col=1的时候,A列还是存在,只不过内容......
  • #yyds干货盘点#python关键字参数
    关键字参数kwarg=value 形式的 关键字参数 也可以用于调用函数。函数示例如下:defparrot(voltage,state='astiff',action='voom',type='NorwegianBlue'):print("--Thisparrotwouldn't",action,end='')print("ifyouput......
  • #yyds干货盘点#python循环中的 break、continue 语句及 else 子句
    break 语句和C中的类似,用于跳出最近的 for 或 while 循环。循环语句支持 else 子句;for 循环中,可迭代对象中的元素全部循环完毕,或 while 循环的条件为假时,执行该子句;break 语句终止循环时,不执行该子句。请看下面这个查找素数的循环示例:>>>forninrange(2,10):.........
  • 程序员面试金典---8
    下一个数思路:求出从最低位的1开始的连续的1的区间将此区间全部变为0,并将区间左侧的那个0变为1将第1步取出的区间右移,直到剩下的1的个数减少一个将第2步和第3步的结果相或/***@param{number}num*@return{number[]}*/varfindClosedNumbers=function(num){......
  • #yyds干货盘点# LeetCode程序员面试金典:找出字符串中第一个匹配项的下标
    题目:给你两个字符串 haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果 needle不是haystack的一部分,则返回 -1。 示例1:输入:haystack="sadbutsad",needle="sad"输出:0解释:"sad"在下标0和6处匹配。第一个匹......
  • #yyds干货盘点# LeetCode面试题:单词搜索
    1.简述:给定一个 mxn二维字符网格 board和一个字符串单词 word。如果 word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 示......
  • 程序员面试金典---7
    二进制转字符串思路;使用2成十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,依次继续。直到积中的整数部分为0,或者整数部分为1,此时0或1为二进制的最后一位。例:0.625=(0.101)B0.625*2=1.25-------取出整数部分10.25*......
  • #yyds干货盘点#使用socket.io实现多房间通信聊天室
    websocket的实现有很多种,像ws和socket.io,这里使用的是socket.io来实现多房间的效果。这里的使用没有使用socket.io官方提供的namespace和room,而是完全通过一个namespace实现的。数据传输使用JSON格式,封装了消息规范消息体规范constactionType={join:'JOIN',//加入leav......
  • #yyds干货盘点#详细讲讲WebSocke
    WebSocketWebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客服端的浏览器,这种方式有一个很大的弊......