腾讯的面试题,谁来挑战下

easyuu 2011-12-28 04:20:21
加精
有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n-3的数组里

请找出丢失的数字,最好能有程序,最好算法比较快
假设n=10000
...全文
32585 427 打赏 收藏 转发到动态 举报
写回复
用AI写文章
427 条回复
切换为时间正序
请发表友善的回复…
发表回复
万玩完顽完 2014-08-02
  • 打赏
  • 举报
回复
引用 412 楼 hkfans2 的回复:
徐武海你于2012年11月委托我司对“采购出口运输系统”进行前端开发合作。 合作周期为两个半月(开发期) + 半个月(测试期);负责前端7个模块的开发。 我司于2013年春节前按赶工期要求完成了前端开发,但由于你的团队当时是兼职性质并且处于成员不稳定的状况下,因此后端的开发进度滞后予前端完成的时间。我们补多半个月时间作为配合,并在2月中至3月底与客户进行测试并作相关修复工作。我司完成项目初期约定的时间和任务。后于4月中,应你再次要求需我司开发工程师进行前端帮助和交接,再无偿增加半个月时间跟进客户的测试反馈和修复相关范围内的工作,以结束委托与我司的合作。 至今,尾款仍未付清,通过手机,短信,QQ等方式都无法与你取得联系。 我司对你这种职业操守和职业道德表示很失望,诚信是我们当初合作的基础。 现在社交媒体传播的渠道发达,这种缺乏诚信的行为会严重影响到你在行业中的声誉,并且会让你的客户和合作伙伴失去信心。 我司现通知你限期年内结清尾款,否则我们将会使用一切必要手段包括采取法律行动来维护我司的利益。 用人单位请注意该应聘者的人品问题!诚信缺失! 徐武海 身份证号码:4228221985022X5038 地址:湖北省恩施市学院路 不诚信开发者 JAVA程序员_徐武海_求职招聘JAVA开发人才EXTJS_JSP_PHP_系统开发IT外包_猎聘
你牛逼,
bjwtufv 2014-08-02
  • 打赏
  • 举报
回复

var getLostNum=function(){
    //存放返回的结果
    var result=[];  
    
    //生成输入的数组
    var inputArr=[];
    
    //随机产生三个数
    var num1=Math.floor(Math.random()*10000);
    var num2=Math.floor(Math.random()*10000);
    var num3=Math.floor(Math.random()*10000);
    
    //不解释
    for(var i=1;i<=10000;i++){
        if(i==num1 || i==num2 || i==num3 && num1!==num2!==num3){
            continue
        }else{
            inputArr.push(i);
        }
    }
    
    //打乱顺序
    inputArr.sort(function(){return Math.random() > 0.6})
    
    //打印出随机取出的数
    console.log(num1,num2,num3);
    
    //临时数组
    var tempArr=[]
    tempArr.length=9999;

    //相应位置设值为1
    for(var i=0;i<inputArr.length;i++){
        tempArr[inputArr[i]-1]=1
    }

    //值不为1 位置为丢失的数据
    for(var k=0;k<tempArr.length;k++){
        if(tempArr[k]!==1){
            result.push(k+1);
        }
    }
    console.log(result)
}()


var getLostNum1=function(){
    //存放返回的结果
    var result=[];

    //生成输入的数组
    var inputArr=[];

    //随机产生三个数
    var num1=Math.floor(Math.random()*10000);
    var num2=Math.floor(Math.random()*10000);
    var num3=Math.floor(Math.random()*10000);

    //不解释
    for(var i=1;i<=10000;i++){
        if(i==num1 || i==num2 || i==num3 && num1!==num2!==num3){
            continue
        }else{
            inputArr.push(i);
        }
    }

    //打乱顺序
    inputArr.sort(function(){return Math.random() > 0.6})

    //打印出随机取出的数
    console.log(num1,num2,num3);

    //临时数组
    inputArr.sort();
    for(var i=0;i<inputArr.length;i++){
        if((inputArr[i+1]-inputArr[i])>1){
            for(var k=1;k<=inputArr[i+1]-inputArr[i];k++){
                result.push[inputArr[i]+k]
            }
        }else{

            continue;
        }
    }
    console.log(result)
}()

taoxinyulov8 2014-07-31
  • 打赏
  • 举报
回复
自己想了个不错的方法,
var arr1=[];
		for(var i=0;i<10000;i++){
			arr1.push(i+1);
		}
        var n1=arr1.splice(Math.floor(Math.random()*arr1.length),1);
        var n2=arr1.splice(Math.floor(Math.random()*arr1.length),1);
        var n3=arr1.splice(Math.floor(Math.random()*arr1.length),1);
        alert(n1+","+n2+","+n3);//先输出,为后面遍历查找缺省的数字做校对
        var arr4=[];
        for(var x=0;x<arr1.length;x++){
            if(x+1==arr1[x]){
                continue;
            }
            else{
                arr4.push(x+1);
                arr1.splice(x,0,x+1);
                continue;
            }
        }
        alert(arr4);
数组一开始是打乱的可以先排序下就行,只要遍历一遍,1ms运行时间
疯狂熊猫人 2014-05-24
  • 打赏
  • 举报
回复
引用 22 楼 prototyper 的回复:
考的是算法,而不是方法。
厉害。如果不算上创建数组和打乱数组顺序的时间,在ie9下,测试了好几次,均为2ms
zyaocccc 2014-05-23
  • 打赏
  • 举报
回复

function getInfo(abc) {
		var abcArr = abc.split(",");
		var retstr ="";
		for (var i = 0; i < abcArr.length; i++) {
			for (var j = i + 1; j < abcArr.length; j++) {
				if (parseInt(abcArr[i]) > parseInt(abcArr[j])) {
					var cache = abcArr[i];
					abcArr[i] = abcArr[j];
					abcArr[j] = cache;
				}
			}
			if (i > 0) {
				var num = parseInt(abcArr[i]) - parseInt(abcArr[i - 1]);
				if (num != 1) {
					for (var k = 1; k < num; k++) {
						retstr += (retstr.length>0?",":"") +(parseInt(abcArr[i - 1]) + k) ;
					}
				}
			}
		} 
		alert(retstr);
	}
ntoyota 2014-05-15
  • 打赏
  • 举报
回复
引用 420 楼 u011960623 的回复:
[quote=引用 19 楼 axiheyhey 的回复:] 借用下11楼的借机数组生成代码
		// 生成命题数组
		function supplyRandomArray(){
			var arr = [], n = 10000;
			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);
			var num3 = arr.splice(Math.floor(Math.random() * arr.length), 1);
			document.write('随机抽掉的3个数是:' + num1 + ' 和 ' + num2 + ' 和 ' + num3 + '<br/><br/>'); 
			arr.sort(function(){return Math.random() > 0.6});
			return arr;
		}
		
		// 从数组中找出丢失的元素
		function getMissElem(arr){
			var result = [], obj = {}, len = arr.length;
			for(var i = 0; i < len; i++){
				obj[arr[i]] = true;
			}
			for(var i = 1; i <= len; i++){
				if(!obj[i]){
					result.push(i);
				}
			}
			return result;
		}
		
		var arr = supplyRandomArray(),
			missElem = getMissElem(arr);
		document.write("丢失的数字为:" + missElem);
既然知道是10000个数字那len为啥不直接写呢,像这样的话,如果丢失的是最后的3个数就不会输出了[/quote] // 从数组中找出丢失的元素 function getMissElem(arr){ var result = [], obj = {}; for(var i = 0; i < 10000; i++){ if(!arr[i]){ result.push(i+1); } } return result; }直接这样写,省了一个循环[/quote].......这样写不行
全息宇宙 2014-05-14
  • 打赏
  • 举报
回复
支持求和法 投票+1
ntoyota 2014-05-14
  • 打赏
  • 举报
回复
引用 19 楼 axiheyhey 的回复:
借用下11楼的借机数组生成代码
		// 生成命题数组
		function supplyRandomArray(){
			var arr = [], n = 10000;
			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);
			var num3 = arr.splice(Math.floor(Math.random() * arr.length), 1);
			document.write('随机抽掉的3个数是:' + num1 + ' 和 ' + num2 + ' 和 ' + num3 + '<br/><br/>'); 
			arr.sort(function(){return Math.random() > 0.6});
			return arr;
		}
		
		// 从数组中找出丢失的元素
		function getMissElem(arr){
			var result = [], obj = {}, len = arr.length;
			for(var i = 0; i < len; i++){
				obj[arr[i]] = true;
			}
			for(var i = 1; i <= len; i++){
				if(!obj[i]){
					result.push(i);
				}
			}
			return result;
		}
		
		var arr = supplyRandomArray(),
			missElem = getMissElem(arr);
		document.write("丢失的数字为:" + missElem);
既然知道是10000个数字那len为啥不直接写呢,像这样的话,如果丢失的是最后的3个数就不会输出了[/quote] // 从数组中找出丢失的元素 function getMissElem(arr){ var result = [], obj = {}; for(var i = 0; i < 10000; i++){ if(!arr[i]){ result.push(i+1); } } return result; }直接这样写,省了一个循环
ntoyota 2014-05-14
  • 打赏
  • 举报
回复
引用 18 楼 zjleon2008 的回复:
楼上的都是数学高手啊,膜拜一下
引用 19 楼 axiheyhey 的回复:
借用下11楼的借机数组生成代码
		// 生成命题数组
		function supplyRandomArray(){
			var arr = [], n = 10000;
			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);
			var num3 = arr.splice(Math.floor(Math.random() * arr.length), 1);
			document.write('随机抽掉的3个数是:' + num1 + ' 和 ' + num2 + ' 和 ' + num3 + '<br/><br/>'); 
			arr.sort(function(){return Math.random() > 0.6});
			return arr;
		}
		
		// 从数组中找出丢失的元素
		function getMissElem(arr){
			var result = [], obj = {}, len = arr.length;
			for(var i = 0; i < len; i++){
				obj[arr[i]] = true;
			}
			for(var i = 1; i <= len; i++){
				if(!obj[i]){
					result.push(i);
				}
			}
			return result;
		}
		
		var arr = supplyRandomArray(),
			missElem = getMissElem(arr);
		document.write("丢失的数字为:" + missElem);
既然知道是10000个数字那len为啥不直接写呢,像这样的话,如果丢失的是最后的3个数就不会输出了
cxmcxm 2014-04-22
  • 打赏
  • 举报
回复
较快的算法 数放于数组中 从1开始到10000逐个到数组中找,找到的取出,将数组最后一个数填到取出数的位置,查找范围减1,如此循环,直到10000, 查找不到的就是被减去的数。
cxmcxm 2014-04-22
  • 打赏
  • 举报
回复
将数放于数组,先排序,从小往大向上数,找到被减少的数
zaz007y 2014-04-17
  • 打赏
  • 举报
回复
等高手,学习
WarOfTheKing 2014-04-16
  • 打赏
  • 举报
回复
引用 46 楼 prototyper 的回复:
唉,我那思路是有依据的:如果把n再提高一个数量级从1万增加到10万,从1到n的连续整数中查找到2个随机抽取(后乱序)的方法——

<script type="text/javascript">
//生成题意
var n = 100000, 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('随机抽掉两个数:' + num1 + ' 和 ' + num2 + '<br/>'); 
arr.sort(function(){return Math.random() > 0.6});

//解题测试
var t = new Date();
var b = 0, c = 0, l = arr.length;               
for (var i = 0; i < n; i ++) {
    b += i + 1;
    c += (i + 1) * (i + 1);                          
    if (i < l) {
        b -= arr[i];
        c -= arr[i] * arr[i];                          
    }
}
var x = (b + Math.sqrt(2 * c - b * b)) / 2;
t = new Date() - t;

document.write('找到的两个数是:' + x + ' 和 ' + [b - x] + '<br/><br/>');
document.write('寻找两数时间是:' + t + '毫秒');
</script>
这样一个循环同步递、加递减规避了JS的大数精度问题,再加上纯数学计算大大提升了运行效率。在FF4.0下测试,耗时在5ms以下。 从前年初至今,我有空的时候陆续试过很多种方法,还木有找到第二种的效率能够与上面思路相比拟——简直数量级的差别,不信可对比测试看看。
我用IE试了下180ms
神之左手 2014-04-14
  • 打赏
  • 举报
回复
没仔细看其他人的代码 用字符串的替换方法应该就可以很方便的达到目的 假设数组 a[n] 提取后成 b[n-3] 先把 a[n] 转换为字符 toString()方法 或者 join()方法 然后用 b[n-3] 作为循环进行替代 replace 没测试过toString或者join效率如何,或者说本质其实也是循环 应该还有更优化的方法,目的应该就是优化循环
jeff_jiang 2014-04-13
  • 打赏
  • 举报
回复
var obj = {},rs = [];
for(var i=0;i<arr.length;i++){
    obj[arr[i]] = 1;
}

for(var i = 0;i<10000;i++){
    if(obj[i]==null)
    rs.push(i);
}
用了下js特性,时间复杂度O(n)
  • 打赏
  • 举报
回复
徐武海你于2012年11月委托我司对“采购出口运输系统”进行前端开发合作。 合作周期为两个半月(开发期) + 半个月(测试期);负责前端7个模块的开发。 我司于2013年春节前按赶工期要求完成了前端开发,但由于你的团队当时是兼职性质并且处于成员不稳定的状况下,因此后端的开发进度滞后予前端完成的时间。我们补多半个月时间作为配合,并在2月中至3月底与客户进行测试并作相关修复工作。我司完成项目初期约定的时间和任务。后于4月中,应你再次要求需我司开发工程师进行前端帮助和交接,再无偿增加半个月时间跟进客户的测试反馈和修复相关范围内的工作,以结束委托与我司的合作。 至今,尾款仍未付清,通过手机,短信,QQ等方式都无法与你取得联系。 我司对你这种职业操守和职业道德表示很失望,诚信是我们当初合作的基础。 现在社交媒体传播的渠道发达,这种缺乏诚信的行为会严重影响到你在行业中的声誉,并且会让你的客户和合作伙伴失去信心。 我司现通知你限期年内结清尾款,否则我们将会使用一切必要手段包括采取法律行动来维护我司的利益。 用人单位请注意该应聘者的人品问题!诚信缺失! 徐武海 身份证号码:4228221985022X5038 地址:湖北省恩施市学院路 不诚信开发者 JAVA程序员_徐武海_求职招聘JAVA开发人才EXTJS_JSP_PHP_系统开发IT外包_猎聘
Leenham 2014-04-08
  • 打赏
  • 举报
回复
用桶排序会不会比较方便: 没有代码,只有文字 1.假设n=10000的话,先根据个位数分成10个桶, 2.找出不满的桶,预期的话,每个桶应该都是1000个数,这样最多会有三个不满的桶(比对大小就可以知道是否满) 3.再根据十位数对不满的桶中的元素继续分成10个桶, 4.依此类推,直至找到对应缺失的值... 这样需要很多空间,效率应该会很快
  • 打赏
  • 举报
回复
上边都是大神啊 ,正在学习中竟来看一下,各位的代码真是短小精悍啊。。。
skyworth98 2014-04-07
  • 打赏
  • 举报
回复
晕,搞什么搞,哪有这么复杂,加起来就好了
引用 24 楼 axiheyhey 的回复:
[Quote=引用 22 楼 prototyper 的回复:] 考的是算法,而不是方法。 [/Quote]别动不动就跟我提算法,这么简单的问题需要用到算法?算上面那位,用到累加,平方和,立方和的就叫算法?
这不是算法是什么?
ZhangRuuui 2014-03-21
  • 打赏
  • 举报
回复
实测10000数据,随机抽掉的3个数是:7337,3833,2114 丢失的数为:2114,3833,7337 findMiss: 2.275ms 实测100000数据,随机抽掉的3个数是:93323,94135,46130 丢失的数为:46130,93323,94135 findMiss: 29.750ms 实测1000000数据,随机抽掉的3个数是:877140,943741,221016 丢失的数为:221016,877140,943741 findMiss: 265.005ms

var setting = {
    "num": 1000000,
    "rndNum": 3
};

function createArr(){
    var arr = [],
        rnd = [];
        
    for (var i = 0, len = setting.num; i < len; i++) {
        arr.push(i);
    }
    
    for (var i = 0, len = setting.rndNum; i < len; i++) {
        rnd[i] = arr.splice(Math.floor(Math.random() * arr.length), 1);
    }
    
    console.log('实测' + setting.num + '数据,随机抽掉的3个数是:' + rnd.join(",")); 
    
    arr.sort(function(){return Math.random() > 0.6});
    
    return arr;
}

function findMiss(arr){
    var _fullArr = function(){
            var ret = [];
            for (var i = 0, len = setting.num; i < len; i++) {
                ret[i] = 0;
            }
            return ret;
        }(),
        _arrStr = "",
        _pos = 1,
        _ret = [];

    for (var i = 0, len = arr.length; i < len; i++) {
        _fullArr[arr[i]] = 1;
    }
    
    _arrStr = _fullArr.join("");
    
    for (var i = 0, len = setting.rndNum; i < len; i++) {
        _pos = _arrStr.indexOf("0");
        _arrStr = _arrStr.replace("0","1");
        _ret.push(_pos);
    }
    return _ret;
}

var test_arr = createArr();

console.time("findMiss");
console.log("丢失的数为:" + findMiss(test_arr));
console.timeEnd("findMiss");
加载更多回复(366)

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧