前言
据说,一只优秀的程序猿往往会有这样的经历,白天遇到一个绞尽脑汁也无法解决的问题,晚上睡了后,半夜在梦中会灵感涌现,立马起床,打开电脑,一气呵成。第二天如果不看注释,完全不知道自己找到了如此巧妙地解决方案。
昨晚躺床上,无意中想到一个问题,突然灵感爆发,想到巧妙解决方法,差点想起床写下来,只是寝室已断电,不了了之。早上爬起来,脸都没洗,先把文章敲了。
问题
非常简单的一个问题,长度为100和101的AB两个数组,数值范围为0-99,含重复,找出来多出来的一个数。
思路
一开始想到的是先排序,然后一趟比较找出不同。 排序方法一开始自然想到标准的快排,对于数字,还有基数与计数。
一想到计数,突然发现根本不需要排序,三次遍历可解。
- 遍历A数组,用数组Count计数;
- 遍历B数组,Count[B[i]]--;
- 遍历Count,值为-1的下标即为所求;
举一反三
然后思维就发散了,进一步想了下
- 长度为100和100+n,找出多出的n个;
- 找出相同的n个,即子集;
- 对于三个数组,求子集(计数数组值为3的下标就是);
- 对于两个数组,求其元素异同
举三反N
- 对于n个数组,求子集(计数为n为所求)
- 对于n个数组,求其元素的异同
举N反N^N
如果题目没给的范围,或者不是数字,大数据量咋办、
- 比如两个元素数组,找出其中一个不同的元素
如果元素值是唯一的,hash,第二次遍历时,hash冲突的即为所求
结论
。。。
结果是昨晚凌晨两三点才睡着,结论就是不能再想了,发散思维太可怕T^T。。
程序猿容易用脑过度,晚上还是好好休息,别想太多,当然,梦中的突然灵感还是要立马爬起床写下来的,毕竟有时候百分之一的灵感更重要。。。
时间: 2024-10-10 05:44:06