两道面试,看似简单却不易

donson2008 2008-07-22 10:18:39
我尊重这家公司,所以我不会说这些面试题与他们关联。
1. 用最简单的办法判断常整型a是2的n次方。

2. 整型数组a[10],b[10]各自的元素互不相同,编程求两者的交集和b中有的而a中没有的元素集合,将它们放在c[10]和d[10]中。

我还没有想到完美的答案,请大家帮忙看看,谢谢!
...全文
608 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
lily604 2008-07-26
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 sc_valentine21 的回复:]
都不是很难,关键是考技巧
[/Quote]
lily604 2008-07-26
  • 打赏
  • 举报
回复 1
[Quote=引用 5 楼 babyvox1999 的回复:]
引用 1 楼 donson2008 的回复:
1. 用最简单的办法判断长整型a是2的n次方。

if(a & (a-1)) return false;
else return true;
[/Quote]

方法不错
iamliadai 2008-07-23
  • 打赏
  • 举报
回复
难道是华为 ? 哈哈,笑死了。这些题目都是教科书上的,被人家用懒了都,只能说明楼主没啥见识。一点原创性都没有。
晨星 2008-07-23
  • 打赏
  • 举报
回复
楼主一开始说是“常整型”,后来又改口说是“长整型”,乱七八糟的。:(
pengzhixi 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 yyyapple 的回复:]
1.


C/C++ codebool is_2pn(long int a, int n)
{
if( n>= sizeof( long int)) return false;
return (a == 1<<n);
}
[/Quote]


我觉得这个很好!学习
九十度黑 2008-07-22
  • 打赏
  • 举报
回复
为什么自己不能修改自己的帖子,BS一下!!!
测试的代码忘了改了,if内容和注释一样了,呵呵。
if ((a & (a-1))  == 0) /*if (a & (~a+1)) == a)也可以*/
九十度黑 2008-07-22
  • 打赏
  • 举报
回复 1
我先声明我的程序不是“完美”,仅供参考。
/*判断a是2的n次方*/
#include <stdio.h>

int main()
{
long a;
printf("Please input a number:");
scanf("%ld", &a);

if (a!=0)
{
if ((a & (~a+1)) == a) /*(a & (~a+1)) == a 也可以*/
printf("Yes\n");
else
printf("No\n");
}
else
printf("No\n");
return 0;
}
/*b数组在a中有的放在c,没有的放在d(长度为10) */
#include <stdio.h>
#define MAXSIZE 10

int main()
{
int a[] = {0,1,2,3,4,5,6,7,8,9};
int b[] = {2,4,6,8,10,12,14,16,18,20};
int c[MAXSIZE] = {0};
int d[MAXSIZE] = {0};

int i, j, k, l;
k = 0;
l = 0;

for (j = 0; j < MAXSIZE; j++)
{
for (i = 0; i < MAXSIZE; i++)
{
if(b[j] == a[i])
{
c[k++] = b[j];
break;
}
}
if (i == MAXSIZE)
d[l++] = b[j];
}
return 0;
}





















Kenny_Glacier 2008-07-22
  • 打赏
  • 举报
回复
没气不顺,想啥说啥了,不好意思
[Quote=引用 24 楼 donson2008 的回复:]
让22楼的朋友气不顺了,抱歉!其实我说的重点是关于题目,而不是公司。
我也是在求解,所以不知道标准答案;但是一个合理完整、令人信服的答案出现的时候,大家肯定都会发现的。

再次谢谢Kenny和所有帮忙的朋友!
[/Quote]
donson2008 2008-07-22
  • 打赏
  • 举报
回复
第二题我有了这样的程序,但现在有两个问题:
1. 不是太简洁;
2. c,d 数组中,我无法找到一个合理的方式来处理无效元素0.

#include <stdio.h>

int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10},
b[10]={7,8,9,10,11,12,13,14,15,16};
static int c[10], d[10];
int i, j, k, flag;

k = 0;
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(a[i] == b[j])
{
c[k++]=a[i];
break;
}
}
}

k = 0;
for(j=0; j<10; j++)
{
flag = 0;
for(i=0; i<10; i++)
{
if(b[j] == a[i])
{
flag = 1;
break;
}
}
if(!flag)
d[k++] = b[j];
}

for(i=0; i<10; i++)
printf("c[%d] = %5d d[%d] = %5d\n", i, c[i], i, d[i]);
return 0;
}

输出:
7 11
8 12
9 13
10 14
0 15
0 16
0 0
0 0
0 0
0 0
donson2008 2008-07-22
  • 打赏
  • 举报
回复
第二题我有了这样的程序,但现在有两个问题:
1. 不是太简洁;
2. c,d 数组中,我无法找到一个合理的方式来处理无效元素0.

#include <stdio.h>

int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10},
b[10]={7,8,9,10,11,12,13,14,15,16};
static int c[10], d[10];
int i, j, k, flag;

k = 0;
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(a[i] == b[j])
{
c[k++]=a[i];
break;
}
}
}

k = 0;
for(j=0; j<10; j++)
{
flag = 0;
for(i=0; i<10; i++)
{
if(b[j] == a[i])
{
flag = 1;
break;
}
}
if(!flag)
d[k++] = b[j];
}

for(i=0; i<10; i++)
printf("c[%d] = %5d d[%d] = %5d\n", i, c[i], i, d[i]);
return 0;
}

输出:
7 11
8 12
9 13
10 14
0 15
0 16
0 0
0 0
0 0
0 0
donson2008 2008-07-22
  • 打赏
  • 举报
回复
让22楼的朋友气不顺了,抱歉!其实我说的重点是关于题目,而不是公司。
我也是在求解,所以不知道标准答案;但是一个合理完整、令人信服的答案出现的时候,大家肯定都会发现的。

再次谢谢Kenny和所有帮忙的朋友!
Kenny_Glacier 2008-07-22
  • 打赏
  • 举报
回复
n<=sizeof(a)*8&&a==1<<n
写错了
Kenny_Glacier 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 donson2008 的回复:]
谢谢大家,提供了很多好的思路。作为中国最好的科技公司,他们的面试题的确不可小觑。

针对上面朋友的回答,我对这两题的细节作一下说明,然后请大家再帮忙看看。我的确还不知道最完美的答案是什么,期待中
第一题:1. a是长整型
2. a是2的n次方(请关注 n)
朋友们的思路很不错,很厉害,不过一般都忽略了这两点.

第二题:我第一感觉也和9楼朋友一样,不过他们不是这个意思,是:a, b各自的元素不同,…
[/Quote]
真没看出啥水平......lz是做广告吗?好大口气,还最好的......
1.如果要关注n的话就更好办了 n<=sizeof(a)*8&&a==1<<(n-1),至于什么类型,无所谓的东西
2.初始化不是问题;可以记录元素个数(其实c和d一共就需要10个就够了)
yyyapple 2008-07-22
  • 打赏
  • 举报
回复
1.

bool is_2pn(long int a, int n)
{
if( n>= sizeof( long int)) return false;
return (a == 1<<n);
}
donson2008 2008-07-22
  • 打赏
  • 举报
回复
谢谢大家,提供了很多好的思路。作为中国最好的科技公司,他们的面试题的确不可小觑。

针对上面朋友的回答,我对这两题的细节作一下说明,然后请大家再帮忙看看。我的确还不知道最完美的答案是什么,期待中
第一题:1. a是长整型
2. a是2的n次方(请关注 n)
朋友们的思路很不错,很厉害,不过一般都忽略了这两点.

第二题:我第一感觉也和9楼朋友一样,不过他们不是这个意思,是:a, b各自的元素不同,所以只是各自不同,但相互之间是可能有相同的元素的;说明完这个之后,我再说说这题要关注的细节:
1. c,d 初始化问题
2. c[10],d[10]中无效元素怎么解决 ???
e_sharp 2008-07-22
  • 打赏
  • 举报
回复
学习
biosheep 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bargio_susie 的回复:]
1. if ((a & (a-1)) == 0)
// a 是2的n次方
[/Quote]

强,学习!!
biosheep 2008-07-22
  • 打赏
  • 举报
回复
第一题:

while(i%2==0)
{
i/=2;
}
retrun i==1?1:0;
刘光伟 2008-07-22
  • 打赏
  • 举报
回复
UP
xkyx_cn 2008-07-22
  • 打赏
  • 举报
回复
2.要先对2个数组排序,然后再归并求交集,b - c即可得到b中有而a中没有的集合d
加载更多回复(31)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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