内容简介:上篇文章写了以我自己的思路来解决这个问题,但是运行时间过长,看了leetcode 上的高效写法是使用位运算的解法,当初我自己写这个问题是也想到了可以用位运算快一点,但是因为基础差,对位运算的掌握不牢靠,还是选择使用了减法的思路,在此将leetcode上高效解法做一个思路分析,加深下自己对位运算的理解[100,3]上面的算法将以前的减操作优化称为位移操作,一次可以累加2的n次方个,减少了循环次数,所以比Part 1 中算法要快
上篇文章写了以我自己的思路来解决这个问题,但是运行时间过长,看了leetcode 上的高效写法是使用位运算的解法,当初我自己写这个问题是也想到了可以用位运算快一点,但是因为基础差,对位运算的掌握不牢靠,还是选择使用了减法的思路,在此将leetcode上高效解法做一个思路分析,加深下自己对位运算的理解
LeetCode上高效解法代码
class Solution { public static int divide(int dividend, int divisor) { //首先处理Integer的最小值溢出问题(和我思路一样) if (dividend == Integer.MIN_VALUE && divisor == -1) { return Integer.MAX_VALUE; } //判断结果符号(这个写法比我的号,但是结果的时候用到了乘法,难道符合题意??费解 ) int sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1; //取被除数最大值 long dvd = Math.abs((long) dividend); //取除数最大值 long dvs = Math.abs((long) divisor); //定义结果 int res = 0; //循环条件:当被除数大于等于除数时候 while (dvd >= dvs) { //为防止溢出,这里使用long类型 long temp = dvs; long mult = 1; //<< 移位操作,向左移动1位 //当dvd大于dvs*2的mult次方的时候,即计算dvd中最多有2的几次方个dvs while (dvd >= (temp << 1)) { temp <<= 1; mult <<= 1; } System.out.printf("%d里面有,2的%d次方个%d\r\n", dvd, mult, dvs); //计算新的dvd,和累加mult dvd -= temp; res += mult; } return res * sign; } }
用例
[100,3]
输出结果
100里面有,2的32次方个3 4里面有,2的1次方个3
总结
上面的算法将以前的减操作优化称为位移操作,一次可以累加2的n次方个,减少了循环次数,所以比Part 1 中算法要快
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Servlets & JSP(中文版)
(美)巴萨姆、(美)塞若、(美)贝茨 / 苏钰函、林剑 / 中国电力出版社 / 2006-10 / 98.00元
《Head First Servlets·JSP》(中文版)结合SCWCD考试大纲讲述了关于如何编写servlets和JSP代码,如何使用JSP表达式语言,如何部署Web应用,如何开发定制标记,以及会话状态、包装器、过滤器、企业设计模式等方面的知识,以一种轻松、幽默而又形象的方式让你了解、掌握servlets和JSP,并将其运用到你的项目中去。《Head First Servlets·JSP》(中......一起来看看 《Head First Servlets & JSP(中文版)》 这本书的介绍吧!
XML 在线格式化
在线 XML 格式化压缩工具
RGB CMYK 转换工具
RGB CMYK 互转工具