百度三面面试题分享

qiaocode 2012-05-12 10:56:28
1、设计一个对乘法是封闭的操作,就是例如输入一个n(比如8),那么在1---8中间的8个数字,任意两个相乘的结果始终都是位于8个数字之间的任意一个数字。举例如下,比如2*3还是6,2*4还是8,但是3*4 、3*4、 4*4 这样的乘积必须始终还是在1---8中间的一个数字。
偶的想法是:如果只定义乘法的话,可以将乘积的结果除以8取余再加1,刚好可以映射到1到8,不知道这样算不算一个思路~~~
偶一开始是这样回答的,但是面试官说,这样做是无法满足消去律的,就是 a*b=a*c 那么b=c
因为按照我说的那个方法的话, 4*2=4*6 但是2 != 6,于是就导致无法满足消去律。
2、是如何统计代码行数以及注释的行数,并写出具体的实现代码。
3、要求用最快的速度求两个数组的交集,提示数组中的元素是无序的。写出具体的实现代码。
4、写程序,将一个浮点数转化为字符串。。

各位大神看到的,给个解法吧,偶当时都回答的很不好
...全文
5216 112 打赏 收藏 转发到动态 举报
写回复
用AI写文章
112 条回复
切换为时间正序
请发表友善的回复…
发表回复
ausky 2012-05-18
  • 打赏
  • 举报
回复
第一题画个表格 先计算不超过n的 然后再去填充其他值 使每行没列不重复 就OK了

1 2 3 4
1 1 2 3 4

2 2 4 1 3

3 3 1 4 2

4 4 3 2 1

tang3214 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 的回复:]
推演一下过程,例如n=4,那么如果需要满足消去律,每一行和每一列的数字都不能相同,需要满足这个规律
1*1 = 1 2*1 = 2 3*1 = 3 4*1 = 4
1*2 = 2 2*2 = 4 3*2 = 1 4*2 = 3
1*3 = 3 2*3 = 1 3*3 = 4 4*3 = 2
1*4 = 4 2*4 = 3 3*4 = 2 4*4 = 1
[/Quote]
刚我也考虑下这个问题啦
感觉百度就是想让面试的建立一个当a,b乘积大于8时对应到1-8的映射。
只要保证a所有对应的积都不冲突就完成任务了。
比如2*5就不能等于2,4,6,8但可以等于1,3,5,7,之后如此继续就可以找到全部对应关系
而8*8的64,考虑交换性,那就有40中结合方法,而结果只有8种,这意味着平均每个结果会对应5种乘法对,并且包含的乘数对各不相同。
只提供一个想法,我自己还没去实现!
li603572310 2012-05-17
  • 打赏
  • 举报
回复
要学好数据结构与算法啊
tmd1991 2012-05-17
  • 打赏
  • 举报
回复
统计代码行数与注释行数的问题 应该分为三个状态:代码计数、注释计数、字符串(这个容易忘记)。
代码态时遇到“/*”、“//”时进行状态转换,进入注释计数
字符隶属于代码计数,但在字符态未结束时忽略“\*”、“\\”
tmd1991 2012-05-17
  • 打赏
  • 举报
回复
第一题:(a*b%8 ? a*b%3 : 8)
定义为:用正常的乘法计算后模8 ,如果结果为零则变为8
(貌似是整数模8的非负最小剩余类)
lpby111 2012-05-16
  • 打赏
  • 举报
回复
我是来看题的,谢谢分享……
project2502 2012-05-15
  • 打赏
  • 举报
回复
怎么都是算法题… 感觉好难
qiaocode 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 101 楼 的回复:]

引用 99 楼 的回复:

引用 98 楼 的回复:

第一题:
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 1
3 4 5 6 7 8 1 2
4 5 6 7 8 1 2 3
5 6 7 8 1 2 3 4
6 7 8 1 2 3 4 5
7 8 1 2 3 4 5 6
8 1 2 3 4 5 6 7
这样的结果应该能满足题目的需求:计算公式为 (……
[/Quote]
是的,这个里面的乘积小于等于8的结果不对的,2*3=4是不对的,应该是 2*3=6,2*4=8,3*2=6,4*2=8的
snakeling 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 99 楼 的回复:]

引用 98 楼 的回复:

第一题:
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 1
3 4 5 6 7 8 1 2
4 5 6 7 8 1 2 3
5 6 7 8 1 2 3 4
6 7 8 1 2 3 4 5
7 8 1 2 3 4 5 6
8 1 2 3 4 5 6 7
这样的结果应该能满足题目的需求:计算公式为 (i-(i-1))*(j+(i+1)……
[/Quote]
你这个不满足结果小于8时,和乘法相同的要求啊。
giskook 2012-05-15
  • 打赏
  • 举报
回复
浮点数转字符串
const char intTable[]={'0','1', '2', '3', '4', '5', '6', '7', '8', '9'};
CString IntToString(long long int value)
{
char result[32];
memset(result, 0, 32);
long long int n = value, m = 0;
int idx = 0;
do
{
m = n%10;
n = n/10;
result[idx]=intTable[m];
idx++;
} while (n!=0);
int nLen = strlen(result);
for(int i = 0; i < nLen/2; i++)
{
char tmp = result[nLen-i-1];
result[nLen-i-1] = result[i];
result[i] = tmp;
}
return CString(result);
}

template<class T>
CString DoubleToString(T value, int precise=sizeof(T)==4?6:15)
{
long long int intValue=value;
CString intPart = IntToString(intValue);
intPart.TrimRight('0');
precise -= intPart.GetLength();
if(precise <= 0)
{
return intPart;
}
if (intPart.IsEmpty())
{
intPart.Insert(0, '0');
}
long long int preciseValue = 1;
for(int i = 0; i <= precise; i++)
{
preciseValue *= 10;
}
intValue = (value-intValue)*preciseValue;
intValue = (intValue%10>=5)?(intValue/10+1):(intValue/10);
CString doublePart = IntToString(intValue);
for(int i = 0; i < precise-doublePart.GetLength(); i++)
{
doublePart.Insert(0, '0');
}
doublePart.TrimRight('0');
if(doublePart.GetLength() > 0)
{
intPart+=".";
if(doublePart.GetLength()>precise)
{
intPart+=doublePart.Left(precise);
}
else
{
intPart+=doublePart;
}
}
return intPart;
}
giskook 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 98 楼 的回复:]

第一题:
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 1
3 4 5 6 7 8 1 2
4 5 6 7 8 1 2 3
5 6 7 8 1 2 3 4
6 7 8 1 2 3 4 5
7 8 1 2 3 4 5 6
8 1 2 3 4 5 6 7
这样的结果应该能满足题目的需求:计算公式为 (i-(i-1))*(j+(i+1))
[/Quote]
当计算结果大于8时,与8求余
giskook 2012-05-15
  • 打赏
  • 举报
回复
第一题:
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 1
3 4 5 6 7 8 1 2
4 5 6 7 8 1 2 3
5 6 7 8 1 2 3 4
6 7 8 1 2 3 4 5
7 8 1 2 3 4 5 6
8 1 2 3 4 5 6 7
这样的结果应该能满足题目的需求:计算公式为 (i-(i-1))*(j+(i+1))
superyinyi 2012-05-15
  • 打赏
  • 举报
回复
第一题我的想法:
(n+8)/8
不知道对不对
snakeling 2012-05-15
  • 打赏
  • 举报
回复
关于第一题,问什么不能引入对输入两数大小判断从而消去交换率问题呢?
算法又没说不能使用取大数这样的措施。
如果输入的数都先取大数,还存在交换率的问题吗?
qiaocode 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 91 楼 的回复:]

交换律比较容易满足:轴对称即可
结合律的话,可以构造一个三维数组,三个坐标都是从1开始,一直到n,数组中的每个值都必须等于三个坐标的乘积,从三个面开始可以得到三个乘积,如果每个乘积都唯一,则满足结合律。
[/Quote]

三维数组同样也是要求对称的
liaoyanstorm 2012-05-15
  • 打赏
  • 举报
回复
来看试题的
qiaocode 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 103 楼 的回复:]

怎么都是算法题… 感觉好难
[/Quote]
对于论坛上某些高手来说,会感觉很简单的
nice_cxf 2012-05-14
  • 打赏
  • 举报
回复
1 2 3 4
2 4 1 3
3 1 4 2
4 3 2 1
这个是唯一解,按你的解释这是不对的,如果这样是没有正解的
nice_cxf 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 67 楼 的回复:]

引用 65 楼 的回复:

1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3

这个是不对的,因为上面写的是4*3==2
但是4*3==2*(2*3) 而你的2*3==4,那么4*3==2*(2*3)==2*4==1
于是4*3就有两个结果了,这样显然不对的
[/Quote]

他这个是错的,但不是你说的原因,而是因为2*2=4是固定的,a*b=b*a只有这一个约束条件,没有附加的条件 ,如果还有你说这种附加条件 按你这么分解就没答案了

qiaocode 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 65 楼 的回复:]

1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
[/Quote]
这个是不对的,因为上面写的是4*3==2
但是4*3==2*(2*3) 而你的2*3==4,那么4*3==2*(2*3)==2*4==1
于是4*3就有两个结果了,这样显然不对的
加载更多回复(87)

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧