g***j 发帖数: 1275 | 1 class Solution {
如下的code可以过,但是有个疑问,为啥,我吧下面的long long的部分改成int,就过
不了了啊?
public:
int divide(int dividend, int divisor) {
// Note: The Solution object is instantiated only once and is reused
by each test case.
if(divisor == 1) return dividend;
if(divisor == -1) return -1*dividend;
int sign = 1;
if(dividend < 0) sign = -1*sign;
if(divisor < 0) sign = -1*sign;
long long remain = abs((long long)dividend); // ???
long long factor = abs((long long)divisor); // ???
if(factor == remain) return sign;
int c = 1;
while(remain > factor) {
factor = factor<<1;
c = c<<1;
}
int result = 0;
while(remain >= abs((long long)divisor)) {
if(remain >= factor) {
remain -= factor;
result +=c;
}
factor = factor>>1;
c = c>>1;
}
return result * sign;
}
}; |
m********c 发帖数: 105 | 2 abs(INT_MIN)结果还是-2147483648,不是2147483648,所以要转换成long long,这是
一个原因,好像还有其他原因 |
g***j 发帖数: 1275 | 3 面试的时候需要考虑这些么?
还有其他情况的overflow
【在 m********c 的大作中提到】 : abs(INT_MIN)结果还是-2147483648,不是2147483648,所以要转换成long long,这是 : 一个原因,好像还有其他原因
|
m********c 发帖数: 105 | 4 我觉得需要考虑吧,不过不确定,看考官吧
【在 g***j 的大作中提到】 : 面试的时候需要考虑这些么? : 还有其他情况的overflow
|
s********u 发帖数: 1109 | 5 题目说不能用乘法哈哈,所以不能用sign*res
我原来以为 if(remain >= factor) {这里改成while会更好,后来一想,最多减一次,
因为是2进制。。
大家觉得这道题目考点是什么呢?也不像是binary search,几乎就是考等比数列求和
公式。。 |
l*n 发帖数: 529 | 6 sign不需要用乘法吧,直接来个minus?-res:res就好了。考点感觉还蛮多的,overflow
、loop watchout、bit operation等等。
【在 s********u 的大作中提到】 : 题目说不能用乘法哈哈,所以不能用sign*res : 我原来以为 if(remain >= factor) {这里改成while会更好,后来一想,最多减一次, : 因为是2进制。。 : 大家觉得这道题目考点是什么呢?也不像是binary search,几乎就是考等比数列求和 : 公式。。
|
k******4 发帖数: 94 | 7 unsigned int newx = x;
If (x<0)
newx = 1+abs(1+x);
abs(INT_MIN)结果还是-2147483648,不是2147483648,所以要转换成long long,这是
一个原因,好像还有其他原因
【在 m********c 的大作中提到】 : abs(INT_MIN)结果还是-2147483648,不是2147483648,所以要转换成long long,这是 : 一个原因,好像还有其他原因
|