平凡中的简单
在51js上看到一个题目。
从1到10w(共10w个数)中随机抽走2个数,然后打乱剩下的数的顺序,问如果从这剩下的数中快速的找出抽走的是哪2个数?
一位牛人朋友写了一个利用积差与和差来判断的方式。
具体参照http://www.cnblogs.com/meteoric_cry/archive/2011/03/16/1986008.html。
我个人是想不到如此了,我想到的是另外一个简单的方式。就是制作数组,然后用下表来排除相应的元素,使得最后数组的元素剩下被抽走的2个数据。考虑到数组下标本身的定位方式,是地址方式直接的定位,所以对cpu的占用情况并不大。效率应该还是可以的。如果js中真的是链表形式存储数组元素的话,那么就可以使用多维的方式进行快速定位.因为要对机器里的东西进行清理,决定在iteye保留此代码,此帖只为保留源码.
?
??????????? var n = 100* 1000;
??? ??? ??? var arr = [];
??? ??? ??? for (var i = 0; i < n ; i++) {
??? ??? ??? ??? arr.push(i+1);
??? ??? ??? }
??? ??? ??? var num1 = arr.splice(Math.floor(Math.random() * arr.length), 1);
??? ??? ??? var num2 = arr.splice(Math.floor(Math.random() * arr.length), 1);
??? ??? ???
??? ??? ??? document.write('抽掉数:<br/>第1个数是:' + num1 + ',第2个数是:' + num2 + '<br/><br/>');
??? ??? ???
??? ??? ??? var arr2=new Array(100);
??? ??? ??? for(var i=0;i<100;i++){
??? ??? ??? ??? arr2[i]=new Array(1000);
??? ??? ??? ??? for(var j=0;j<1000;j++){
??? ??? ??? ??? ??? arr2[i][j]=i*1000+j;???
??? ??? ??? ??? }???
??? ??? ??? }
??? ??? ??? for(var idx in arr){
??? ??? ??? ??? var temp=arr[idx]-1;
??? ??? ??? ??? var idx1=Math.floor(temp/1000);
??? ??? ??? ??? var idx2=temp%1000;
??? ??? ??? ??? delete(arr2[idx1][idx2]);???
??? ??? ??? }
??? ??? ??? for(var idx in arr2){
??? ??? ??? ??? if(arr2[idx].length!=0){
??? ??? ??? ??? ??? for(var idx2 in arr2[idx]){
??? ??? ??? ??? ??? ??? document.write(arr2[idx][idx2]+1+"<br/>");
??? ??? ??? ??? ??? }
??? ??? ??? ??? }
??? ??? ??? }
许多复杂问题都有简单而又平凡的方式来处理,我个人并不是一个很博学的人,对于处理问题也总是从简单平凡的方式来处理,当然这许多人的眼里或许太普通了,程度就是如此也没什么办法,只有在自己能想到的范围里来解决问题。