a********r 发帖数: 218 | 1 要求实现:
divide(int a, int b)
菜鸟写了一行
return (double) a/b;
印度哥说不行
哪位达人能做一下这道题?
跪求!!! |
y***n 发帖数: 1594 | |
j**********3 发帖数: 3211 | |
l*****a 发帖数: 14598 | 4 好歹b==0要处理一下吧
【在 a********r 的大作中提到】 : 要求实现: : divide(int a, int b) : 菜鸟写了一行 : return (double) a/b; : 印度哥说不行 : 哪位达人能做一下这道题? : 跪求!!!
|
y***n 发帖数: 1594 | |
d*******y 发帖数: 31 | 6 java的话要先把a和b都cast成double才行。 |
w*******8 发帖数: 10 | 7 public class Solution {
public int divide(int dividend, int divisor) {
int a = Math.abs(dividend);
int b = Math.abs(divisor);
boolean neg = (dividend > 0 && divisor < 0) || (dividend < 0 &&
divisor > 0);
if (divisor == 0) {
return Integer.MAX_VALUE;
}
if (divisor == Integer.MIN_VALUE) {
return (dividend == Integer.MIN_VALUE) ? 1 : 0;
}
if (dividend == Integer.MIN_VALUE) {
if (neg) {
return -1 + divide(dividend + b, b);
}
else {
return 1 - divide(dividend + b, b);
}
}
int product = b, result = 0;
while (a >= b) {
int q = 1;
while (a - product >= product) {
q = q << 1;
product = product << 1;
}
a = a - product;
product = b;
result += q;
}
return (neg) ? -result : result;
}
} |
y***n 发帖数: 1594 | 8 我觉得还是楼主写的好,如果没有任何附加条件的话。 |
a********r 发帖数: 218 | 9 这绝对是M家的真题
野蛮生长大牛,
可否请你解释一下你的算法?
大雨大牛,
我的肯定不对,印度哥说了。你能不能贡献一下你的代码?
【在 w*******8 的大作中提到】 : public class Solution { : public int divide(int dividend, int divisor) { : int a = Math.abs(dividend); : int b = Math.abs(divisor); : boolean neg = (dividend > 0 && divisor < 0) || (dividend < 0 && : divisor > 0); : if (divisor == 0) { : return Integer.MAX_VALUE; : } : if (divisor == Integer.MIN_VALUE) {
|
d*******y 发帖数: 31 | 10 我想唯一的差别是能不能用/这个operator。
【在 a********r 的大作中提到】 : 这绝对是M家的真题 : 野蛮生长大牛, : 可否请你解释一下你的算法? : 大雨大牛, : 我的肯定不对,印度哥说了。你能不能贡献一下你的代码?
|
|
|
s**********r 发帖数: 117 | 11 前几天版上说印度傻逼transfer过来都有16万。 |
w*******8 发帖数: 10 | 12 是小弱不是大牛
正刷题呢,看到是leetcode上原题就顺手把代码搬过来了
Divide Two Integers:
思路是:既然是int的除法,不用考虑小数部分(余数),就是整数(商),那就数
dividend 里有多少个divisor. 这样,如果商是n 需要O(n)计算,可以用下二分法,
divide&conquer 递归调用一下,就是lgN了
剩下的就是边界条件: 1)正负 2)极值
int 的范围是 -2,147,483,648 to 2,147,483,647
这里有个细节,当时看别人的代码觉得比较巧妙:
正负数的范围是不对称的
-2147483648 abs 一下还是自己本身,那就先count一次,再计算
之前看到很多方法是转成double 再强转回int,其实是没必要的
其他基本的int 计算也大多是这个思路 比如 int sqrt(int) int pow(int)
【在 a********r 的大作中提到】 : 这绝对是M家的真题 : 野蛮生长大牛, : 可否请你解释一下你的算法? : 大雨大牛, : 我的肯定不对,印度哥说了。你能不能贡献一下你的代码?
|
m*******s 发帖数: 23 | 13 public int divide(int dividend, int divisor) {
if (divisor == 0) throw new IllegalArgumentException();
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
int result = 0;
while (a >= b) {
long c = b;
for (int i = 0; c <= a; i++) {
a -= c;
result += 1 << i;
c <<= 1;
}
}
return ((dividend^divisor) >> 31) == 0 ? result : 0 - result;
} |
q*****l 发帖数: 124 | 14 LZ萌萌哒!
曾经有一个面试官让我写sort,我直接给了个Arrays.sort(A) |
U***A 发帖数: 849 | 15 -2147483648 abs 一下还是自己本身,?
这个对吗?
【在 w*******8 的大作中提到】 : 是小弱不是大牛 : 正刷题呢,看到是leetcode上原题就顺手把代码搬过来了 : Divide Two Integers: : 思路是:既然是int的除法,不用考虑小数部分(余数),就是整数(商),那就数 : dividend 里有多少个divisor. 这样,如果商是n 需要O(n)计算,可以用下二分法, : divide&conquer 递归调用一下,就是lgN了 : 剩下的就是边界条件: 1)正负 2)极值 : int 的范围是 -2,147,483,648 to 2,147,483,647 : 这里有个细节,当时看别人的代码觉得比较巧妙: : 正负数的范围是不对称的
|
m**r 发帖数: 574 | |
t*******e 发帖数: 1760 | 17 对的,因为溢出了
【在 U***A 的大作中提到】 : -2147483648 abs 一下还是自己本身,? : 这个对吗?
|
s********k 发帖数: 2352 | 18 你这个 divide(1, 2) 的话, 结果是0.0
【在 a********r 的大作中提到】 : 要求实现: : divide(int a, int b) : 菜鸟写了一行 : return (double) a/b; : 印度哥说不行 : 哪位达人能做一下这道题? : 跪求!!!
|
f*****g 发帖数: 887 | |
r*******e 发帖数: 971 | 20 位运算很不错。
然后前面的边界条件也都考虑到了。
只是Math.abs()没问题么???面试的时候是允许导入java.math.*么? |
f******n 发帖数: 279 | |
q*******z 发帖数: 62 | |