前些日子 ISCteam要招 intern,我帮着出了道题 被扔在选作题里面(居然还被标为英文阅读题。。。庐山瀑布汗)
面试的同志们打完了 由出题人负责打分 如果不满意可以进行申诉
不过 我倒还真没想到我的题也有考生会来申诉
前两道都是任务相关,最后一道是一个问如果交换变量 如何用时间换空间 写段代码出来
基本上来讲 对就是对 错就是错 明明没什么好说的呀。
此君申辩 略过不表 (反正被我说的服了,一点脾气也没有)
在这里小谈下时间换空间的方法 抛个转头 等着有玉来砸
时间换空间
时间资源是什么 估计大家都知道,顾名思义么。
空间资源是什么,就是我们的硬件资源,CPU 内存什么的
一般的交换方法 大家都会
设个中间变量做中继来交换
tmp = a
a = b
b = tmp
但既然是时间换空间 自然要尽量减少空间消耗 也就是 不用中间变量
这个时候 简单的办法是
两数叠加再分配
a = a+b
b = a-b
a = a-b
但许多情况是要被考虑的 比如 超过上限怎么办
此时就可以判断两数是否同号,若是不同号则用符号比较就好, 同号的话 可以用减法代替加法 来处理掉
当年还在某个群厮混的时候还看到了某一牛人的写法
好像是
a^=b^=a^=b
大概是这样的,是用异或的办法来处理
当然 在某些可以用指针的语言里就更方便了 交换个地址就成了
由于对指针已经忘光了 在这里 抄袭下别人的文章 来说明这个问题
if(a{
a=(int*)(b-a);
b=(int*)(b-(int(a)&0x0000ffff));
a=(int*)(b+(int(a)&0x0000ffff));
}
else
{
b=(int*)(a-b);
a=(int*)(a-(int(b)&0x0000ffff));
b=(int*)(a+(int(b)&0x0000ffff));
}
a=(int*)(b-a);
b=(int*)(b-(int(a)&0x0000ffff));
a=(int*)(b+(int(a)&0x0000ffff));
}
else
{
b=(int*)(a-b);
a=(int*)(a-(int(b)&0x0000ffff));
b=(int*)(a+(int(b)&0x0000ffff));
}
之所以分两种情况是为了避免 地址计算出现负数
大概能想到的就这么多。
不过 在考卷中有个答案还是令我耳目一新并埋怨自己怎么把老本行都忘记了
那就是单片机
将两个变量分别赋予 AH AL 然后让AX自滚动4位 就好了
砖头已出 待玉登场~