zoukankan      html  css  js  c++  java
  • 腾讯(求丢失的元素)

    一.从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;
    
  • 相关阅读:
    构建之法阅读笔记03
    构建之法阅读笔记02
    构建之法读书笔记01
    梦断代码读书笔记03
    背包九讲问题
    C-01背包问题
    C-最长回文子串(2)
    C-最长回文子串(1)
    C语言顺序栈实现
    带头结点头部插入创建链表
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2572235.html
Copyright © 2011-2022 走看看