linux 交换变量值不使用中间值,一道面试题——不用中间变量交换两个整型变量的值...

已经进入九月份了,马上又要进入新一轮的校园招聘了,想想自己也已经毕业一年多了,依稀还记得当年面试笔试时遇到的一些面试题,所以决定写一些东西出来分享下,期待能对学弟学妹们有些许的帮助,在此也不胜幸慰了。当然,我也只是一个新手,不对的地方望各位指出,共同学习进步。

大家都知道,校园招聘一般考的都是些C语言(这里只对招聘C语言程序员而言,其实招C++的很多时候考的也是C)的基础和细节问题,并不会考你怎样在linux/unix环境下用C编程,写个串口通信的程序等等问题,最多就是面试时问下你会不会linux/unix,然后大概了解下你熟悉的程度,所以基础和细节很重要,最好能买本有关面试方面的书看看,如《程序员面试宝典》,在这里我想谈谈面试时遇到的一道试题:不用中间变量如何交换两个整型变量的值?请写出代码。这样的题其实在排序的算法中也是可以隐式的考察的,能够看出一个人有否C编程技巧的概念,即是否注意C语言的效率问题。这题在老谭的那本书上也有(对于老谭的书我不想多说什么了,大家都心中有数)。下面来看看代码吧:

#include

void intSwap(int *pTest1, int *pTest2);

int main(int argc, char *argv[])

{

int a,b;

puts("Input first integer:");

scanf("%d", &a);

puts("Input second integer:");

scanf("%d", &b);

intSwap(&a, &b);

printf("Output,swap two integers:\t%d\t%d\n",a , b);

exit(0);

}

void intSwap(int *pTest1,int *pTest2)

{

*pTest1 ^= *pTest2;

*pTest2 ^= *pTest1;

*pTest1 ^= *pTest2;

}

运行输出(红色为自己输入的数值):

Input first integer:

10

Input second integer:

5

Output,swap two integer:    5    10

用三个异或就可以得到想要的结果了,也许有人很疑惑为什么要考这种题,因为任何数在计算机中都是一组0、1的组合,所以位运算的效率比其他运算符都要高。

还记得在某个C语言的QQ群中,有个在读生问怎么把字符串反序输出,这种问题对于大部分初学者来生第一反应就是用个中间变量作为过渡,交换字符串首尾的字符,那么有没有好点的方法呢?(不能说更好,可能还有别的高效率方法,反正我是不知道^_^)看了前面交换两个整数,大家应该会有点启发,因为字符也是以整数存储在机器中的,所以我们就自然想到了用三个异或去交换,相信在面试时如果能这样答题,一定会给面试官留下一个深刻的印象,就像有些人在面试中尽量用switch代替if-else写程序一样。。。不走寻常路,这点在面试笔试中很重要。

#include

#define NUMBER_LEN 1024

#define ERR(fmt, args...) fprintf(stderr, "TraceUtil> Error: " fmt, ## args)

int main()

{

int idx1,idx2,numBytes;

unsigned char array[NUMBER_LEN];

char temp;

puts("input a string");

if (fgets(array, NUMBER_LEN, stdin) == NULL) {

ERR("Failed to get strings\n");

exit(1);

}

numBytes = strlen(array);

for (idx1 = 0, idx2 = numBytes - 1; idx1 < idx2; idx1++, idx2--) {

#if 1

array[idx1] ^= array[idx2];

array[idx2] ^= array[idx1];

array[idx1] ^= array[idx2];

#else

temp = array[idx1];

array[idx1] = array[idx2];

array[idx2] = temp;

#endif

}

printf("%s\n", array);

exit(0);

}

在面试笔试常考的东东中还有给一组整数,然后叫你用各种排序算法进行排序,如冒泡排序、shell排序、快速排序等,在这些排序中难免要交换两个元素的值,此时我们就可以用上面的方法去实现了,关于排序以后有空再说吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值