题目

两个整数相除

将两个整数相除,要求不使用乘法、除法和 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 两个数的除法相关推荐

  1. lintcode 中等题:Single number III 落单的数III

    题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...

  2. 截止目前为止,我遇到的最难的一道算法题:计算相邻两个数的最大差值

    hello,今天给大家带来一道算法题.这道算法题,是我目前为止,见过最难的一道题.那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值. 要求时间复杂度O( ...

  3. lintcode 中等题:A + B Problem A + B 问题

    题目: 中等 A + B 问题 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符. 如果 a=1 并且 b=2,返回3 注意 你不需要从输入流读入数据,只需要根据aplusb的两个参数 ...

  4. lintcode 中等题:subSets 子集

    题目 子集 给定一个含不同整数的集合,返回其所有的子集 样例 如果 S = [1,2,3],有如下的解: [[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[] ] 注意 ...

  5. 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= ...

  6. 力扣(LeetCode)刷题,简单+中等题(第35期)

    力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升. 第1题:解码异或后的排列 试题要求如下: 回答(C语言): /*** Note: ...

  7. 辗转相除法是求两个数的最大公约数的方法。

    题目: /*      第五题 辗转相除法是求两个数的最大公约数的方法. */ 代码部分: #include<iostream> using namespace std;int x; in ...

  8. arrays中copyof复制两个数组_异或的魅力!图解「数组中两个数的最大异或值」

    今天分享的题目来源于 LeetCode 第 421 号问题:数组中两个数的最大异或值.在 异或 这个知识点里面属于一个中高难度的题目. 题目描述 给定一个非空数组,数组中元素为 a0, a1, a2, ...

  9. 中两个数做减法_四年级数学下册 | 第1单元加、减法的意义和各部 分之间的关系(P13)...

    电子课本 点击图片,查看大图 ▼▼▼▼ 知识点 1.加法的意义:把两个数合并成一个数的运算,叫做加法. 2.加法各部分的名称:相加的两个数叫做加数.加得的数叫做和. 1.减法的意义:已知两个数的和与其 ...

最新文章

  1. 十个你需要在 PHP 7 中避免的坑
  2. Linux升级openssh一次成功版本
  3. **PCD数据获取:Kinect+OpenNI+PCL对接(代码)
  4. Flink 合流水位线图解
  5. ipython控制台 绘图 后端_如何面试Python后端工程师?
  6. 个人知识管理能解决什么问题?
  7. 页面加载之window.onload=function(){} 和 $(function(){})的区别
  8. 人人商城小程序服务器根目录,微擎通用-人人商城v3小程序安装步骤小程序配置说明...
  9. 多缝夫琅禾费衍射matlab,用matlab实现夫琅禾费多缝衍射代码
  10. Ubuntu9.10下永中Office2009安装
  11. PS证件照更改背景颜色
  12. MATLAB绘制平方函数,MATLAB绘制由函数x^2/4+y^2/9+z^2/16=1形成的立体图,
  13. 和差化积公式详细推导
  14. c语言五子棋最简单的ai,C++简单五子棋的AI设计实现
  15. Elasticsearch 跨机房灾备方案实战(一) —— 消息队列实现双写
  16. 简单 4部 完成 android 二维码扫一扫功能(5分钟实现)
  17. xxl-job任务详解
  18. Html标签分类及总结
  19. 华为服务器检索信息,裸金属服务器使用标签检索资源
  20. sort()函数排序vector

热门文章

  1. ubuntu12.04 qtcreate支持中文输入
  2. iOS下数据存储的方式
  3. ORA-00911错误及解决方法(另附所有ora错误原因及解决方法 网址)
  4. [导入]给老家新楼的对联
  5. C/C++常见问题(转)
  6. 业务线开发流程图(四)
  7. seq2seq模型_使用Tensorflow搭建一个简单的Seq2Seq翻译模型
  8. 累计收益是我的收益吗?
  9. 闺女在大连上大学,一个月1500生活费她说少
  10. 两大思维,就可以让你轻松完成任意一个目标