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 here
        if(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 here
        if(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 here
        if(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;
        else
            return -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 here
        if(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;
        else
            return -count;
    }
}

Java Code

时间: 2025-01-20 16:11:34

lintcode 中等题:Divide Two Integers 两个数的除法的相关文章

lintcode 中等题:2 Sum 两个数的和

题目 两数之和 给一个整数数组,找到两个数使得他们的和等于一个给定的数target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是1到n,不是以0开头. 样例numbers=[2, 7, 11, 15], target=9 return [1, 2] 注意你可以假设只有一组答案. 解题 题目之前做LeetCode时候写过这个,利用这里利用ArrayList,当 target- numbers[i] 不在 list中,把numbers[i

lintcode 中等题:4 Sum 四个数之和

题目 四数之和 给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d). 样例 例如,对于给定的整数数组S=[1, 0, -1, 0, -2, 2] 和 target=0. 满足要求的四元组集合为: (-1, 0, 0, 1) (-2, -1, 1, 2) (-2, 0, 0, 2) 注意 四元组(a, b, c, d)中,需要满足a <= b <= c <= d 答案中不可以包含重复的四元组. 解题 怎么感觉下面程序已经没法修改了但是在

LeetCode 29 Divide Two Integers (不使用乘法,除法,求模计算两个数的除法)

题目链接: https://leetcode.com/problems/divide-two-integers/?tab=Description Problem :不使用乘法,除法,求模计算两个数的除法~ 除法运算:被除数中包含有多少个除数的计算 由于是int类型的除法,因此结果可能超过int的最大值,当超过int的最大值时输出int的最大值 另写除法函数,计算出除法的商. 首先判断出除法运算后的结果是正数还是负数. 之后需要将被除数和除数都变为正数,进行进一步计算 当被除数小于除数时,返回0

【LeetCode每天一题】Divide Two Integers(两整数相除)

Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator. Return the quotient after dividing dividend by divisor. The integer division should truncate toward zero. Example 1:             Inp

[LintCode] Divide Two Integers 两数相除

Divide two integers without using multiplication, division and mod operator. If it is overflow, return 2147483647 Have you met this question in a real interview? Example Given dividend = 100 and divisor = 9, return 11.

lintcode 中等题:next permutation下一个排列

题目 下一个排列 给定一个整数数组来表示排列,找出其之后的一个排列. 样例 给出排列[1,3,2,3],其下一个排列是[1,3,3,2] 给出排列[4,3,2,1],其下一个排列是[1,2,3,4] 注意 排列中可能包含重复的整数 解题 和上一题求上一个排列应该很类似 1.对这个数,先从右到左找到递增序列的前一个位置,peakInd 2.若peakInd = -1 这个数直接逆序就是答案了 3.peakInd>= 0 peakInd这个位置的所,和 peakInd 到nums.size() -1

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

题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度,O(1)的额外空间复杂度 解题 根据落单的数I,可以想到,所有的数进行异或运行的结果就是所求两个数的异或结果. 这个异或的结果,二进制数是1的位置说明这两个数对应的二进制位不相同.然后再怎么还原???参考,理解的不是很透,找到第k位后,再判断数组中所以数的第k位是0 还是1,,出现两次的数对求解无影

leetCode 29.Divide Two Integers (两整数相除) 解题思路和方法

Divide Two Integers Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. 思路:这个题算法上不是很难,但是通过率相当低,只有15%,果然,自己在写完之后,各种出错,而且错误不是算法上的错误,是各种边界值没有考虑到,很多溢出错误等.下面是具体代码,有详细注释. public class Solution { p

leetcode第28题--Divide Two Integers

Divide two integers without using multiplication, division and mod operator. 分析:题目意思很容易理解,就是不用乘除法和模运算求来做除法,很容易想到的一个方法是一直做减法,然后计数,超时.在网上找到一种解法,利用位运算,意思是任何一个整数可以表示成以2的幂为底的一组基的线性组合,即num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n.基于以上这个公式以及左移一位相当于乘以2,我们先让除数左移直到