[睡前灵感and发散思维]由一个简单的数组比较问题而想到的

前言

据说,一只优秀的程序猿往往会有这样的经历,白天遇到一个绞尽脑汁也无法解决的问题,晚上睡了后,半夜在梦中会灵感涌现,立马起床,打开电脑,一气呵成。第二天如果不看注释,完全不知道自己找到了如此巧妙地解决方案。

昨晚躺床上,无意中想到一个问题,突然灵感爆发,想到巧妙解决方法,差点想起床写下来,只是寝室已断电,不了了之。早上爬起来,脸都没洗,先把文章敲了。

问题

非常简单的一个问题,长度为100和101的AB两个数组,数值范围为0-99,含重复,找出来多出来的一个数。

思路

一开始想到的是先排序,然后一趟比较找出不同。 排序方法一开始自然想到标准的快排,对于数字,还有基数与计数。

一想到计数,突然发现根本不需要排序,三次遍历可解。

  1. 遍历A数组,用数组Count计数;
  2. 遍历B数组,Count[B[i]]--;
  3. 遍历Count,值为-1的下标即为所求;

举一反三

然后思维就发散了,进一步想了下

  • 长度为100和100+n,找出多出的n个;
  • 找出相同的n个,即子集;
  • 对于三个数组,求子集(计数数组值为3的下标就是);
  • 对于两个数组,求其元素异同

举三反N

  • 对于n个数组,求子集(计数为n为所求)
  • 对于n个数组,求其元素的异同

举N反N^N

如果题目没给的范围,或者不是数字,大数据量咋办、

  • 比如两个元素数组,找出其中一个不同的元素

如果元素值是唯一的,hash,第二次遍历时,hash冲突的即为所求

结论

。。。

结果是昨晚凌晨两三点才睡着,结论就是不能再想了,发散思维太可怕T^T。。

程序猿容易用脑过度,晚上还是好好休息,别想太多,当然,梦中的突然灵感还是要立马爬起床写下来的,毕竟有时候百分之一的灵感更重要。。。

posted on 2015-03-16 10:45  初开  阅读(346)  评论(0编辑  收藏  举报

导航