lintcode 中等题:Divide Two Integers 两个数的除法
题目
两个整数相除
将两个整数相除,要求不使用乘法、除法和 mod 运算符。
如果溢出,返回 2147483647
。
给定被除数 = 100
,除数 = 9
,返回 11
解题
15%的通过率,减法,位运算?表示不知道如何下手。
法一:利用减法,超时,人工直接去除的一些情况太流氓。
public class Solution {/*** @param dividend the dividend* @param divisor the divisor* @return the result*/public int divide(int dividend, int divisor) {// Write your code hereif(dividend == 0)return 0;if(dividend == divisor)return 1;int count = 0;int flag1 = 1;int flag2 = 1;if(dividend == Integer.MIN_VALUE && divisor ==1)return dividend;if(dividend == Integer.MIN_VALUE && divisor == -1)return 2147483647;if(dividend<0){flag1 = -1;dividend = -dividend;}if(divisor<0){flag2 = -1;divisor = -divisor;}// dividend = 2147483647;// divisor = 2;if(divisor == 1)return dividend*flag1*flag2;while(dividend >= divisor){dividend -= divisor;count +=1;}return count*flag1*flag2;} }
Java Code
法二:批量减法,参考博客,但是还是超市,除数是1的时候超时,是1的时候我单独处理,是2的时候超时
public class Solution {/*** @param dividend the dividend* @param divisor the divisor* @return the result*/public int divide(int dividend, int divisor) {// Write your code hereif(dividend == 0)return 0;if(dividend == divisor)return 1;int count = 0;int flag1 = 1;int flag2 = 1;if(dividend == Integer.MIN_VALUE && divisor ==1)return dividend;if(dividend == Integer.MIN_VALUE && divisor == -1)return 2147483647;if(dividend<0){flag1 = -1;dividend = -dividend;}if(divisor<0){flag2 = -1;divisor = -divisor;}// dividend = 2147483647;// divisor = 2;if(divisor == 1)return dividend*flag1*flag2;while(dividend >= divisor){int sum = divisor;int count1 = 1;while(sum + sum <= dividend){count1 += count1;sum += sum;}dividend -= sum;count += count1;}return count*flag1*flag2;} }
Java Code
法三:利用位运算
参考博客,感觉与法二很像的,我把二中减肥换成位运算,也是运行超时,我不理解,直接用他的程序就可以通过。
public class Solution {/*** @param dividend the dividend* @param divisor the divisor* @return the result*/public int divide(int dividend, int divisor) {// Write your code hereif(divisor ==0)return Integer.MAX_VALUE;if(divisor == -1 && dividend == Integer.MIN_VALUE)return Integer.MAX_VALUE;int count = 0;long pDividend = Math.abs((long)dividend);long pDivisor = Math.abs((long)divisor);while(pDividend >= pDivisor){int count1 = 0;while((pDivisor<<count1)<= pDividend){count1++;}count += 1<<(count1 - 1);pDividend -=(pDivisor<<(count1 - 1));}if( dividend >0 && divisor >0 || dividend<0 && divisor<0)return count;elsereturn -count;} }
Java Code
博客中的位运算改成减法的也可以通过,就是我自己搞的减法的就是能通过,无法理解
public class Solution {/*** @param dividend the dividend* @param divisor the divisor* @return the result*/public int divide(int dividend, int divisor) {// Write your code hereif(divisor ==0)return Integer.MAX_VALUE;if(divisor == -1 && dividend == Integer.MIN_VALUE)return Integer.MAX_VALUE;int count = 0;long pDividend = Math.abs((long)dividend);long pDivisor = Math.abs((long)divisor);while(pDividend >= pDivisor){int count1 = 1;long sum = pDivisor;while(( sum + sum)<= pDividend){count1 += count1;sum +=sum;}count += count1;pDividend -= sum;}if( dividend >0 && divisor >0 || dividend<0 && divisor<0)return count;elsereturn -count;} }
Java Code
转载于:https://www.cnblogs.com/theskulls/p/4981529.html
lintcode 中等题:Divide Two Integers 两个数的除法相关推荐
- lintcode 中等题:Single number III 落单的数III
题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...
- 截止目前为止,我遇到的最难的一道算法题:计算相邻两个数的最大差值
hello,今天给大家带来一道算法题.这道算法题,是我目前为止,见过最难的一道题.那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值. 要求时间复杂度O( ...
- lintcode 中等题:A + B Problem A + B 问题
题目: 中等 A + B 问题 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符. 如果 a=1 并且 b=2,返回3 注意 你不需要从输入流读入数据,只需要根据aplusb的两个参数 ...
- lintcode 中等题:subSets 子集
题目 子集 给定一个含不同整数的集合,返回其所有的子集 样例 如果 S = [1,2,3],有如下的解: [[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[] ] 注意 ...
- Trick 一题多解——交换两个数(swap)
1. Python 的方式 a, b = b, a 2. 异或(避免中间变量的定义) (a⊕b)⊕a=b(a⊕b)⊕b=a(a⊕b)⊕a=b(a⊕b)⊕b=a (a\oplus b)\oplus a= ...
- 力扣(LeetCode)刷题,简单+中等题(第35期)
力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升. 第1题:解码异或后的排列 试题要求如下: 回答(C语言): /*** Note: ...
- 辗转相除法是求两个数的最大公约数的方法。
题目: /* 第五题 辗转相除法是求两个数的最大公约数的方法. */ 代码部分: #include<iostream> using namespace std;int x; in ...
- arrays中copyof复制两个数组_异或的魅力!图解「数组中两个数的最大异或值」
今天分享的题目来源于 LeetCode 第 421 号问题:数组中两个数的最大异或值.在 异或 这个知识点里面属于一个中高难度的题目. 题目描述 给定一个非空数组,数组中元素为 a0, a1, a2, ...
- 中两个数做减法_四年级数学下册 | 第1单元加、减法的意义和各部 分之间的关系(P13)...
电子课本 点击图片,查看大图 ▼▼▼▼ 知识点 1.加法的意义:把两个数合并成一个数的运算,叫做加法. 2.加法各部分的名称:相加的两个数叫做加数.加得的数叫做和. 1.减法的意义:已知两个数的和与其 ...
最新文章
- 十个你需要在 PHP 7 中避免的坑
- Linux升级openssh一次成功版本
- **PCD数据获取:Kinect+OpenNI+PCL对接(代码)
- Flink 合流水位线图解
- ipython控制台 绘图 后端_如何面试Python后端工程师?
- 个人知识管理能解决什么问题?
- 页面加载之window.onload=function(){} 和 $(function(){})的区别
- 人人商城小程序服务器根目录,微擎通用-人人商城v3小程序安装步骤小程序配置说明...
- 多缝夫琅禾费衍射matlab,用matlab实现夫琅禾费多缝衍射代码
- Ubuntu9.10下永中Office2009安装
- PS证件照更改背景颜色
- MATLAB绘制平方函数,MATLAB绘制由函数x^2/4+y^2/9+z^2/16=1形成的立体图,
- 和差化积公式详细推导
- c语言五子棋最简单的ai,C++简单五子棋的AI设计实现
- Elasticsearch 跨机房灾备方案实战(一) —— 消息队列实现双写
- 简单 4部 完成 android 二维码扫一扫功能(5分钟实现)
- xxl-job任务详解
- Html标签分类及总结
- 华为服务器检索信息,裸金属服务器使用标签检索资源
- sort()函数排序vector