由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问一个Facebook大数相乘的题
相关主题
做题做得很郁闷,求指点【非死不可面经】今天FB面试onsite,求bless
求助一道算法题, 在限定三个operation下使一个数变成1的最小操作数罗马转数字,数字转罗马问题
wildcard string matching,谁有最简洁的非递归解法?T家电面一般有几轮? [UPDATE面经]
请问大牛们关于Regular expression matchinglargest rectangle in histogram
问一个facebook的电面比较久之前T家的面试
问个amazon面试题N queen problem 很难想啊
直方图下雨这道题怎么解?做了一下Kth small in young tablet 和 largest rectangle contain 1s
被gray code打击了GOOG intern interview 题目
相关话题的讨论汇总
话题: int话题: nadd话题: char话题: nres话题: ncur
进入JobHunting版参与讨论
1 (共1页)
w****x
发帖数: 2483
1
两个大数相乘
char* multiply(char*,char*);
正常在15分钟写出的解法有吗, 不能转integer再乘啊
w****o
发帖数: 2260
2
能具体的讲讲这个题是什么东西吗?
是不是说给了两个字符串,每个都是代表了一个很长的10进制表示的数?
比如 char str1[] = "23456789009877666555544444"
char str2[] = "346587436598437594375943875943875"
最后求出他们的乘积?

【在 w****x 的大作中提到】
: 两个大数相乘
: char* multiply(char*,char*);
: 正常在15分钟写出的解法有吗, 不能转integer再乘啊

w****x
发帖数: 2483
3



【在 w****o 的大作中提到】
: 能具体的讲讲这个题是什么东西吗?
: 是不是说给了两个字符串,每个都是代表了一个很长的10进制表示的数?
: 比如 char str1[] = "23456789009877666555544444"
: char str2[] = "346587436598437594375943875943875"
: 最后求出他们的乘积?

c****p
发帖数: 6474
4
就是实现乘法的竖式实现吧。
把两个操作数按一位、两位、三位或者四位十进制数(取决于int类型的大小)分割,
存储成整弄数组,然后按照做乘法的步骤算一遍。空间复杂度O(m+n),时间复杂度O(mn
),mn为两操作数的长度。【 在 wwwyhx (wwwyhx) 的大作中提到: 】
z********c
发帖数: 72
5
这是Leetcode上Multiplication那道题的程序,过了数据
string multiply(string num1, string num2) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector res(num1.size () + num2.size (), 0);
for (int i = 0; i < num1.size (); i++) {
int carry = 0;
for (int j = 0; j < num2.size (); j++) {
int d1 = num1[num1.size () - 1 - i] - '0';
int d2 = num2[num2.size () - 1 - j] - '0';
carry = d1 * d2 + res[i + j] + carry;
res[i + j] = carry % 10;
carry = carry / 10;
}
res[i + num2.size ()] = carry;
}

int i = num1.size () + num2.size () - 1;
while (i > 0 && res[i] == 0) i--;
string result;
while (i >= 0) result += char (res[i --] + '0');

return result;
}

【在 w****x 的大作中提到】
: 两个大数相乘
: char* multiply(char*,char*);
: 正常在15分钟写出的解法有吗, 不能转integer再乘啊

t*********7
发帖数: 255
6
就是数组实现乘法竖式吧... 但是要考虑数组空间的上限越界么?..
m********1
发帖数: 31
7
请问你code里的
int d1 = num1[num1.size () - 1 - i] - '0';
int d2 = num2[num2.size () - 1 - j] - '0';
那个减去 '0' 是干什么用的呢?

【在 z********c 的大作中提到】
: 这是Leetcode上Multiplication那道题的程序,过了数据
: string multiply(string num1, string num2) {
: // Start typing your C/C++ solution below
: // DO NOT write int main() function
: vector res(num1.size () + num2.size (), 0);
: for (int i = 0; i < num1.size (); i++) {
: int carry = 0;
: for (int j = 0; j < num2.size (); j++) {
: int d1 = num1[num1.size () - 1 - i] - '0';
: int d2 = num2[num2.size () - 1 - j] - '0';

e***l
发帖数: 710
8
字符数字转换为整数数字,'0'代表0的ascii码
m********1
发帖数: 31
9
嗯,谢谢啦

【在 e***l 的大作中提到】
: 字符数字转换为整数数字,'0'代表0的ascii码
n**e
发帖数: 116
10
signus?
相关主题
问个amazon面试题【非死不可面经】今天FB面试onsite,求bless
直方图下雨这道题怎么解?罗马转数字,数字转罗马问题
被gray code打击了T家电面一般有几轮? [UPDATE面经]
进入JobHunting版参与讨论
l***i
发帖数: 1309
11
面世问这个比较变态把,没有任何技术含量,就是别错。string倒过来放,负号先拿掉
,返回pointer先malloc/new。还有什么注意事项么。
uva上有一道题要算满足一定条件的加()种数,recursion很快就写出来了,然后就要用
这个arbitrary precision integer arithmetic。写了个char*的结果TLE无数次。最后
有个大牛hint用vector,然后每个int可以一次算9位数字,结果轻松过。
去年还是前年的google codejam qual有一道题是用这个的,neal_wu的code可以用来学
习。
w****x
发帖数: 2483
12

靠, 太扯了, 15分钟电面谁TMD 15分钟想的出这个解法, 而且只会c语言的根本很难做, 电面出
这个题的人脑袋没问题吧!!!
没想出这个解法的就是我下面的这种烂code:
string Multiple(string str1, string str2)
{
assert(str1.size() > 0 && str2.size() > 0);
string strRes;
for (int i = str2.size() - 1; i >= 0; i--)
{
int nAdd = 0;
string strCur;
for (int j = str1.size() - 1; j >= 0; j--)
{
int nTmpI = str2[i] - '0';
int nTmpJ = str1[j] - '0';
int nRes = nTmpJ * nTmpI + nAdd;
nAdd = nRes / 10;
strCur.insert(strCur.begin(), nRes%10 + '0');
}
if (nAdd > 0) //missing
strCur.insert(strCur.end(), nAdd + '0');
if (strRes.empty())
{
strRes = strCur;
continue;
}
strCur.insert(strCur.end(), '0');
nAdd = 0;
int nRes = strRes.size() - 1;
int nCur = strCur.size() - 1;

string strTmpRes;
while (nCur >= 0 && nRes >= 0)
{
int nTmpCur = strCur[nCur] - '0';
int nTmpRes = strRes[nRes] - '0';
int nDigit = nTmpCur + nTmpRes + nAdd;
nAdd = nDigit / 10;
strTmpRes.insert(strTmpRes.begin(), nDigit%10 + '0');
nRes--, nCur--;
}
if (nRes >= 0)
{
while (nRes >= 0)
{
int nTmpRes = strRes[nRes] - '0';
int nDigit = nTmpRes + nAdd;
nAdd = nDigit / 10;
strTmpRes.insert(strTmpRes.begin(), nDigit%10 + '0');
nRes--;
}
if (nAdd > 0) strTmpRes.insert(strTmpRes.begin(),
'1');//missing
}

if (nCur >= 0)
{
while (nCur >= 0)
{
int nTmpRes = strCur[nCur] - '0';
int nDigit = nTmpRes + nAdd;
nAdd = nDigit / 10;
strTmpRes.insert(strTmpRes.begin(), nDigit%10 + '0');
nCur--;
}
if (nAdd > 0) strTmpRes.insert(strTmpRes.begin(),
'1');//missing
}
strRes = strTmpRes;
}
return strRes;
}

【在 z********c 的大作中提到】
: 这是Leetcode上Multiplication那道题的程序,过了数据
: string multiply(string num1, string num2) {
: // Start typing your C/C++ solution below
: // DO NOT write int main() function
: vector res(num1.size () + num2.size (), 0);
: for (int i = 0; i < num1.size (); i++) {
: int carry = 0;
: for (int j = 0; j < num2.size (); j++) {
: int d1 = num1[num1.size () - 1 - i] - '0';
: int d2 = num2[num2.size () - 1 - j] - '0';

m***n
发帖数: 2154
13
呵呵,这个其实比较容易。先写一个字符串相加的方法,
然后用小学学过的办法,一位一位来。。
不过15分钟有点夸张。
a***g
发帖数: 234
14
这题很难写完一次通过编译
15分钟有点扯。。。
c****p
发帖数: 6474
15
这个用C写也不难吧。

做, 电面出

【在 w****x 的大作中提到】
:
: 靠, 太扯了, 15分钟电面谁TMD 15分钟想的出这个解法, 而且只会c语言的根本很难做, 电面出
: 这个题的人脑袋没问题吧!!!
: 没想出这个解法的就是我下面的这种烂code:
: string Multiple(string str1, string str2)
: {
: assert(str1.size() > 0 && str2.size() > 0);
: string strRes;
: for (int i = str2.size() - 1; i >= 0; i--)
: {

p*****2
发帖数: 21240
16

C麻烦就在分配内存的时候不知道分多少。如果用char[], 进位的时候就不够空间了。

【在 c****p 的大作中提到】
: 这个用C写也不难吧。
:
: 做, 电面出

c****p
发帖数: 6474
17
这样空间和时间效率都不好。
考虑到现在int一般是32位(4e9),
每个int元素可以存多位十进制数。
这样的话,单次int乘法的复杂度没有变化,
但是总的乘法次数下降了,使用空间也相应下降了。【 在 zhangchitc (zhangchitc)
的大作中提到: 】
c****p
发帖数: 6474
18
m*n位,结果长度不会超过m+n-1位啊。

【在 p*****2 的大作中提到】
:
: C麻烦就在分配内存的时候不知道分多少。如果用char[], 进位的时候就不够空间了。

w****x
发帖数: 2483
19

)
15分钟....

【在 c****p 的大作中提到】
: 这样空间和时间效率都不好。
: 考虑到现在int一般是32位(4e9),
: 每个int元素可以存多位十进制数。
: 这样的话,单次int乘法的复杂度没有变化,
: 但是总的乘法次数下降了,使用空间也相应下降了。【 在 zhangchitc (zhangchitc)
: 的大作中提到: 】

p*****2
发帖数: 21240
20

应该不会超过m+n吧?比如9*9=81, 占两位。
是这样子的。不过写的时候要考虑很多小细节,真的不容易bug free。至少跟java比要
麻烦不少。

【在 c****p 的大作中提到】
: m*n位,结果长度不会超过m+n-1位啊。
相关主题
largest rectangle in histogram做了一下Kth small in young tablet 和 largest rectangle contain 1s
比较久之前T家的面试GOOG intern interview 题目
N queen problem 很难想啊【一个BB公司问的字母排序的问题】
进入JobHunting版参与讨论
c****p
发帖数: 6474
21
这题是POJ 1001的一个子算法。

【在 w****x 的大作中提到】
:
: )
: 15分钟....

c****p
发帖数: 6474
22
而且这题基本没有什么tricky的地方吧。。
时间紧的话可以先说你知道有哪些corner case,但是时间比较紧,这里假设两个字符串
符合XX的通用格式。
然后开始照着思路写。。。【 在 wwwyhx (wwwyhx) 的大作中提到: 】
p*****2
发帖数: 21240
23

练过当然要好多了。如果做过几遍是可以15分钟完成。但是如果没做过的话,难度还是
蛮高吧?

【在 c****p 的大作中提到】
: 这题是POJ 1001的一个子算法。
c****p
发帖数: 6474
24
写bug free的可能是用点难。
不过核心代码并不长。

【在 p*****2 的大作中提到】
:
: 练过当然要好多了。如果做过几遍是可以15分钟完成。但是如果没做过的话,难度还是
: 蛮高吧?

p*****2
发帖数: 21240
25

这个有时间还得练练。

【在 c****p 的大作中提到】
: 写bug free的可能是用点难。
: 不过核心代码并不长。

w****x
发帖数: 2483
26

说实话, 我不大信没做过几遍原题能15分钟写完, 大家也不是搞ACM竞赛的

【在 c****p 的大作中提到】
: 写bug free的可能是用点难。
: 不过核心代码并不长。

s**u
发帖数: 2294
27
mark
s*******f
发帖数: 1114
28
//码遍本版
//i cannot get this should-be-right version within 15 minutes
//use reversed storage. say 1345 store as "5431"
char* MultiplyString(char *a,char *b){
if (!a || !b)
return NULL;
int la = strlen(a);
int lb = strlen(b);
int lc = la + lb + 1;
char *ret = new char[lc];
char *r = ret;
memset(ret, '\0', lc);
while (*a){
char *p = b;
char *q = r++;
int inc = 0;
int mul = *a - '0';
while (*p){
int qq = *q?(*q - '0'):0;
int m0 = mul * (*p - '0') + qq + inc;
*q++ = (char)(m0 % 10 + '0');
inc = m0 / 10;
++p;
}
while (inc != 0){
int qq = *q?(*q - '0'):0;
int m1 = qq + inc;
*q++ = (char)(m1 % 10 + '0');
inc = m1 / 10;
}
++a;
}
//test
printf("%s\n", ret);
return ret;
}
void TestMultiplyString(){
char *a = MultiplyString("12", "10");
char *b = MultiplyString("12", "0");
char *c = MultiplyString("2", "10");
char *d = MultiplyString("1216494413148", "17673735345330");
char *e = MultiplyString("2803", "456");
}

【在 w****x 的大作中提到】
: 两个大数相乘
: char* multiply(char*,char*);
: 正常在15分钟写出的解法有吗, 不能转integer再乘啊

h****e
发帖数: 928
29
这道题目如果真是FB的高频题,那就硬背一个最简洁的解法吧。
r*****e
发帖数: 792
30
背哪个呢?
弄个大数加法考考字符串操作也就罢了,乘法真没什么意思。

【在 h****e 的大作中提到】
: 这道题目如果真是FB的高频题,那就硬背一个最简洁的解法吧。
1 (共1页)
进入JobHunting版参与讨论
相关主题
GOOG intern interview 题目问一个facebook的电面
【一个BB公司问的字母排序的问题】问个amazon面试题
问个《编程实践》(英文版)里面的问题直方图下雨这道题怎么解?
为什么做了400道算法题还是那么菜被gray code打击了
做题做得很郁闷,求指点【非死不可面经】今天FB面试onsite,求bless
求助一道算法题, 在限定三个operation下使一个数变成1的最小操作数罗马转数字,数字转罗马问题
wildcard string matching,谁有最简洁的非递归解法?T家电面一般有几轮? [UPDATE面经]
请问大牛们关于Regular expression matchinglargest rectangle in histogram
相关话题的讨论汇总
话题: int话题: nadd话题: char话题: nres话题: ncur