腾讯(求丢失的元素)

一.从1~100中随机抽走一个数字,剩下的99个数字被打乱顺序放到数组 a[99]。

int a,k=0;
srand(time(NULL));
a = rand()%100+1;//随机从0~100抽取一个数
int array[99] = {0};//数组保存数据
for(int i = 1; i <= 100; ++i)
{
    if(i != a)
    array[k++]  = i;//获取剩下的99个数字
}

//打乱剩下99个数据
for(int i = 0; i <99; ++i)
{
  int j = rand()%99;//随机获取一个数组下标
  //将i下标处的数据与j下标数据交换
  int b =   array[i];
   array[i] =  array[j];
  array[j] = b;
}

二.有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n
求丢失的元素.

这原是一道JSP面试题 

1.二分查找 

2.遍历数组,求取数组的累加和s, 平方和qs。
用1...10000的累加和减去s, 得到移除两数之和a,
用1...10000的平方和减去qs,得到移除两数之和b,

那么解方程就可以了
x1 + x2 = a
x1^2 + x2^2 = b

需要用的高中数学中的角坐标变换,和差化积什么的。

至于去掉三个数大家可以试试立方和
x1 + x2 + x3 = a
x1^2 + x2^2 + x3 = b
x1^3 + x2^3 + x3^3 = c
方程大家可以任意构造,只要其和不用太大,并且易于求解就可以了

设减少的3个数分别为x、y、z,3个数的和为b,3个数的平方和为c,3个数的立方和为d。
据题意有下面3个等式联立:
x + y + z = b ①
x * x + y * y + z * z = c ②
x * x * x + y * y * y + z * z * z = d ③
只要求出了b、c、d,我们就可以把①式两边平方再减去②式得到——
x * y + y * z + x * z = f(a, b, c) ④
再通过(x + y + z)^3 = x^3 + y^3 + z^3 + ... + 6x * y * z的公式和①②③式代入处理③式得到——
x * y * z = f(a, b, c) ⑤
根据①④⑤就能转换成一元三次方程,通过盛金公式(B^2-4AC<0)求取3个根——也就是被减少的那3个数。

3.
bitmap,hash方法暂时不会 

4.
memset(flag,0,sizeof(flag));
for(int i=1;i<=n-3;++i)
flag[a[i]]=1;
for(int i=1;i<=n;++i)
if(!flag[i])
cout<<i;

 

时间: 2024-09-27 13:21:30

腾讯(求丢失的元素)的相关文章

html5-腾讯 求判断用户平台代码详解

问题描述 腾讯 求判断用户平台代码详解 刚看WEB前端代码,就看到了腾讯的这段代码,不懂,求详细指教 if(window.location.toString().indexOf('pref=padindex') != -1){}else{ if(/AppleWebKit.*Mobile/i.test(navigator.userAgent) || (/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|

减治求有重复元素的全排列

求n个元素的全排列的所有解可以用减治法:每次拎出一个数做前缀,对剩下的元素再求全排列,直至只剩一个元素.代码源自<算法分析与设计(王晓东)>,复杂度O(n!) 1 //输出k~m的所有全排列 2 void perm(int k,int m) 3 { 4 if(k==m) 5 { 6 for(int i=0;i<=m;i++) 7 printf("%d ", list[i]); 8 printf("\n"); 9 }else 10 { 11 for(

php求数组全排列,元素所有组合的方法_php技巧

本文实例讲述了php求数组全排列,元素所有组合的方法.分享给大家供大家参考,具体如下: <?php $source = array('pll','我','爱','你','嘿'); sort($source); //保证初始数组是有序的 $last = count($source) - 1; //$source尾部元素下标 $x = $last; $count = 1; //组合个数统计 echo implode(',', $source), "<br>"; //输出第

求查找过半元素的O(N)算法

问题描述 过半元素:在一个有N个元素的数组中,出现次数大于N/2的元素为过半元素,例如:{3,3,4,2,4,4,2,4,4}的过半元素为4{3,3,4,2,4,4,2,4}没有过半元素求一个线性算法O(N),要求如果存在过半元素,找出来,如果不存在,给出报告谢谢啦 解决方案 解决方案二:http://topic.csdn.net/u/20100430/16/3a815617-9d6f-4945-b15c-14dfecfe4b23.html基本已经解决了解决方案三:谢谢了.....

c++求循环队列的元素个数

问题描述 c++求循环队列的元素个数 int getSize( )const {return (rear-front+maxsize)%maxsize;} 函数体返回的为什么不是rear-front?两者有啥区别吗? 解决方案 如果rear<front结果是rear-front+maxsize 如果rear>front结果是rear-front 为了用一个表达式同时表达两者,用(rear-front+maxsize)%maxsize 假设maxsize=10 rear=1 front=9,那么

百度面试题:求一个已排序的数组中绝对值最小的元素

题目为: 有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4. 这一题该如何求呢? 初步的解决思路是:     1.数组中的元素全为正,取最左边的数字:     2.数组中的元素全为负,取最右边的数字的绝对值:     3.数组中有正数有负数,就用二分法查找,判断中间元素的符号        a)中间元素为

java求数组元素重复次数和java字符串比较大小示例_java

复制代码 代码如下: /** * Name: 求数组中元素重复次数对多的数和重复次数 * Description:  * 数组中的元素可能会重复,这个方法可以找出重复次数最多的数,同时可以返回重复了多少次. * 但需要知道这个数组中最大的元素是多少,如果无法确定,就悲剧啦~ * * @param array目标数组: *           max数组中数据的最大值: * @return 返回一个包含重复次数最多的数(value)和重复次数(maxCount)的map集合: *         

javascript中求绝对值最小的数

有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4. 问题分解: 第一步:二分法寻找改变符号的位置(0视为正数) 第二步:比较位置左右数字的绝对值大小,取较小的那一个 <script language="javascript"> var getBound = function(a,fr,

求字符串的len组合数(java程序)

import java.util.List; import java.util.ArrayList; /** * 求字符串的len组合数 * * @author wenin819 * */ public class Combination{ /** * 求组合数的主要方法 */ public static List<String> combination(String inStr, int len){ StringBuffer noDoubleStr =new StringBuffer(inS