【LeetCode】P029_DivideTwoIntegers

【题目】

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

题目的意思就是:不使用*、/、%运算符进行除法运算

【思路】

这道题最直接的想法,就是被除数每次减去除数,计算减了多少次,即为所求。但是这个办法的效率太低,试想被除数是Integer.MAX_VALUE(2147483647),除数是1,则要减2147483647次,很明显会发生TLE。

更好的方法:
不是每次减去除数,而是每次减后除数*2,结果每次累加除数的相应的倍数。

【代码】

  1. public class P029_DivideTwoIntegers {
  2. public int divide(int dividend, int divisor) {
  3. int sign = 1;
  4. if (dividend < 0) {
  5. sign = -sign;
  6. }
  7. if (divisor < 0) {
  8. sign = -sign;
  9. }
  10. long n1 = Math.abs((long)dividend);
  11. long n2 = Math.abs((long)divisor);
  12. long ans = 0;//用long是为了处理溢出,比如当ans为2147483648的情况
  13. while (n1 >= n2) {
  14. long base = n2;
  15. for (int i = 0; n1 >= base; i++) {
  16. n1 -= base;
  17. base<<=1;
  18. ans+=1<<i;
  19. }
  20. }
  21. //处理溢出的情况
  22. //int的范围为-2147483648到2147483647
  23. //dividend=Integer.MIN_VALUE,即-2147483648
  24. //divisor=-1,此时将发生溢出,按题目要求,返回Integer.MAX_VALUE
  25. if (ans * sign > Integer.MAX_VALUE)
  26. return Integer.MAX_VALUE;
  27. return (int) (sign*ans);
  28. }
  29. }

来自为知笔记(Wiz)

时间: 2024-11-10 07:48:33

【LeetCode】P029_DivideTwoIntegers的相关文章

【leetcode】Generate Parentheses

题目: 给定整数n,返回n对匹配的小括号字符串数组. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 分析: 这种问题的模式是:1)问题的解有多个 ,2)每个解都是由多个有效的 "步骤" 组成的,3)变更以有解的某个或某些"步骤"

【LeetCode】Implement strStr()

Implement strStr() Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack. 标准KMP算法.可参考下文. http://blog.csdn.net/yaochunnian/article/details/7059486 核心思想在于求出模式串前缀与后缀中重复部分,将重复信息保存在n

【LeetCode】Add Two Numbers

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6 ->

【LeetCode】Pascal&#39;s Triangle

Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 这题别想用通项公式做,n choose m里面的连乘必然溢出,老老实实逐层用定义做. class Solution { public: vector<vector<

【LeetCode】Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 思路:第一遍正常复制链表,同时用哈希表保存链表中原始节点和新节点的对应关系,第二遍遍历链表的时候,再复制随机域. 这是一种典型的空间换时间的做法,n个节点,需要大小为O(n

【leetcode】Max Points on a Line (python)

给定一个点,除该点之外的其他所有点中,与该点的关系要么是共线,要么就是共点,也就是两点重合. 共线有三种情况:水平共线,垂直共线,倾斜的共线.合并下这三种情况就是斜率存在的共线和斜率不存在的共线. 那么我们的任务就是针对每个点,找出与其共线的这些情况中,共线最多的点的个数. 注意:最终的结果别忘了加上共点的个数. class Solution: def maxPoints(self, points ): if len( points ) <= 1: return len( points ) ma

【LeetCode】 Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4], the contiguous subarray [4,−1,2,1] has the largest sum = 6. More practice: If you have figu

【Leetcode】Length of Last Word

Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the length of last word in the string. If the last word does not exist, return 0. Note: A word is defined as a character sequence consists of non-space cha

【Leetcode】Path Sum II

Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum. For example: Given the below binary tree and sum = 22, 5 / 4 8 / / 11 13 4 / \ / 7 2 5 1 return [ [5,4,11,2], [5,8,4,5] ] 思路:与[Leetcode]Path Sum 不同