【LeetCode 29】Divide Two Integers

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

If it is overflow, return MAX_INT.

题意:

  实现除法,但不允许用乘、除、以及取模运算。

思路:

  一下一下减必然显得很low,事实上可以第一次用 dividend 减 divisor,第二次用 dividend - divisor 减 2 * divisor,第三次用 dividend - 3 * divisor 减 4 * divisor... 直到减不下去了,那么此时再乖乖的用dividend - (x = 1+2+4+...+2^n) * divisor 减 divisor,dividend - (x+1) * divisor 减 2 * divisor... 循环往复,计好数就ok啦。这道题有个特殊的trick,网上很多accept的代码我再提交已经过不去了(很好奇当年他们怎么过的。。。),只能默默地手动判断了。

C++:

 1 class Solution {
 2 public:
 3     int divide(int dividend, int divisor) {
 4
 5         if(dividend == 0 || divisor == 0)
 6             return 0;
 7         //特殊判断,超过最大值应返回MAX_INT
 8         if(dividend == -2147483648 && divisor == -1)
 9             return 2147483647;
10
11         long long a = abs(static_cast<long long>(dividend));
12         long long b = abs(static_cast<long long>(divisor));
13         long long ret = 0;
14
15         while(a >= b)
16         {
17             long long c = b;
18
19             for(int i = 0; a >= c; i++)
20             {
21                 a -= c;
22                 c <<= 1;
23                 ret += 1 << i;
24             }
25         }
26         return ((dividend ^ divisor) >> 31) ? (-ret) : (ret);
27     }
28 };
时间: 2024-10-15 10:36:18

【LeetCode 29】Divide Two Integers的相关文章

【leetcode刷题笔记】Divide Two Integers

Divide two integers without using multiplication, division and mod operator. 题解:要求不用乘除和取模运算实现两个数的除法. 那么用加减法是很自然的选择.不过如果一次只从被除数中剪掉一个除数会TLE.所以我们借助移位运算,依次从被除数中减去1个除数,2个除数,4个除数......当减不动的时候,再依次从被除数中减去......4个除数,2个除数,1个除数. 例如50除以5的计算过程如下: dividend exp tem

【LeetCode 229】Majority Element II

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space. 思路: [LeetCode 169]Majority Element 的拓展,这回要求的是出现次数超过三分之一次的数字咯,动动我们的大脑思考下,这样的数最多会存在几个呢,当然是2个嘛.因此,接着上一题的方

【LeetCode OJ】Sum Root to Leaf Numbers

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 # Definition for a  binary tree node # class TreeNode: #     def __init__(self, x): #         self.val = x #         self.left = No

【LeetCode OJ】Longest Consecutive Sequence

Problem Link: http://oj.leetcode.com/problems/longest-consecutive-sequence/ This problem is a classical problem where we can reduce the running time by the help of hash table. By given a list of numbers, we can find the longest consecutive sequence b

【LeetCode OJ】Word Ladder I

Problem Link: http://oj.leetcode.com/problems/word-ladder/ Two typical techniques are inspected in this problem: Hash Table. One hash set is the words dictionary where we can check if a word is in the dictionary in O(1) time. The other hash set is us

【leetcode系列】String to Integer (atoi)

这个我就直接上代码了,最开始把"abc123"也算作合法的了,后来查了一下atoi的定义,把这种去掉了. public class Solution { public static int atoi(String inStr) { long result = 0L; /* * 网上查了一下,atoi函数的定义是如果第一个非空格字符存在,是数字或者正负号则开始做类型转换, * 之后检测到非数字(包括结束符\0)字符时停止转换,返回整型数.否则,返回零.可能的输入情况有: 1.空字符串 *

【leetcode系列】Valid Parentheses

很经典的问题,使用栈来解决,我这里自己实现了一个栈,当然也可以直接用java自带的Stack类. 自己实现的栈代码: import java.util.LinkedList; class StackOne { LinkedList<Object> data; int top; int maxSize; StackOne(int size) { // TODO Auto-generated constructor stub top = -1; maxSize = 100; data = new

【leetcode系列】3Sum

这个题我最开始的思路是:先一个数定下来,然后在除这个数之外的集合里面找另外两个数,最后计算和.如此反复,对于N个数,需要进行N-2次循环. 我遇到的问题就是怎么找另外两个数,其实我想过参照Two Sum里面的解法,就是用Hashtable存,键值对的结构是<任意两个数的和,<下标1,下标2>>,但是构造这个Hashtable就需要O(N^2),后面真正解的时候有需要O(N^2). 参考了大牛的解法后,明白了找两个数还是用两个下标同时往中间移动比较好,下面上代码. import ja

【leetcode系列】Two Sum

解法一,我自己想的,有点弱,时间复杂度O(n^2). public class Solution { public int[] twoSum(int[] numbers, int target) { int[] result = new int[2]; for (int i = 0; i < numbers.length; i++) { for (int j = i + 1; j < numbers.length; j++) { if (numbers[i] + numbers[j] == t