leetcode 029 Divide Two Integers

3380 단어 LeetCode

제목


Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.

생각:


위치 이동 조작부호를 이용하여 해답을 구하지만, 위치 이동 연산에 대해서는 나는 결코 잘하지 못한다.그래서 나는 C#의 해를 참고하여 귀속으로 풀었다.귀속하기 전에 데이터를 처리해야 한다. 1.제수가 1인 경우 피제수로 바로 돌아갑니다.2. 제수가 -1일 때 두 가지 상황이 있다. (1) 제수가 Integer.MIN_VALUE일 경우 Integer.MIN_VALUE제-1이 넘치기 때문에 Integer.MAX_VALUE(2)제수의 반대수를 되돌려준다.반환 값의 양과 음의 번호를 기록하려면, 피제수는 제수 기호와 반대로 음이고 그렇지 않으면 양이다.4. 피제수와 제수를 모두 음수로 한다. 계산이 편리하기 때문에 상기 두 번째 점을 배제한 후 음수 연산이 넘치지 않는다.5. 귀속을 시작한다.
PS: 0의 경우를 제외하고는 고려할 필요가 없습니다. 용례에 이런 상황은 없습니다.반복 프로세스:
  • 특히 주의, 여기는 두 개의 음수 연산
  • 귀속 종료 조건: 피제수가 제수보다 클 때(음수 연산이기 때문에), 0 반환;같을 때 1을 되돌려줍니다.
  • 귀속 과정에서 차례대로 피제수로 2i배를 감량하여dividend−(divisor)i<=(divisor)i까지 한다.이 과정은 상보다 작은 수를 찾는 것과 같고 귀속 과정은 끊임없이 이 수를 상에 가깝게 하고 최종적으로 결과를 얻는 과정이다.
  • 좌회전 연산을 두 번 사용했는데 좌회전은 곱하기 2
  • 에 해당한다

    코드:

    public int divide(int dividend, int divisor)
    {
        if(divisor == 1) return dividend;// 1 。。。
        if(divisor == -1) return dividend == Integer.MIN_VALUE ? Integer.MAX_VALUE : -dividend;// -1 。。。
        boolean sign = (dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0);// 
        dividend = dividend > 0 ? -dividend : dividend;// 
        divisor = divisor > 0 ? -divisor : divisor;// 
        int res = div(dividend, divisor);// 
        return sign ? res : -res;
    }
    
    private int div(int dividend, int divisor)
    {
        if(dividend > divisor) return 0;
        if(dividend == divisor) return -1;
        int res = -1, tmp = divisor;
        while(dividend - tmp <= tmp)
        {
            tmp <<= 1;// tmp*=2;
            res <<= 1;// res*=2;
        }
        return div(dividend - tmp, divisor) + res;
    }
    

    결과 세부 사항 (그림):

    좋은 웹페이지 즐겨찾기