关于巨人网络笔试题

原题大概是这样的:
//输入一个n,得到一个从1到n的数组,将第一个数抛弃,再将新的在前面的数放到最后,直到还剩最后一个数
本人用了队列实现了这个功能,然后通过队列实现的结果找出了规律。比如:


由此得出输出是第几个数的公式为:
     (n-2^((int)sqrt(n))*2

以下是代码部分:
#include <iostream>
#include <queue>
#include "math.h" 

using namespace std;

int deleteNum(int numList[],int n);
int main(){
    int n;
    cout<<"输入数组规模:"<<endl; 
    while(cin>>n){
    cout<<endl;
    int numList[n];
    for(int i=0;i<n;i++){
        cin>>numList[i];
    }
    deleteNum(numList,n);
    cout<<"输入数组规模:"<<endl; 
    }
    return 0;
}

int deleteNum(int numList[],int n){
      queue<int> numQueue;
      for(int i=0;i<n;i++){
          numQueue.push(numList[i]);
      }
      while(numQueue.size()>1){
          numQueue.pop();
          numQueue.push(numQueue.front());
          numQueue.pop();
          
      }
      cout<<"当输入的数组规模为"<<n<<"时,"<<"输出的最后一个数为第:" <<endl;
      cout<<numQueue.front()<<"个数"<<endl;
      
      cout<<"找规律得出的答案:"<<endl;
      //找规律的结果为:(n-2^(int)(√n) )*2 
      int sqrtN = floor(sqrt(n));  //开根 
      int value = 2<<(sqrtN-1);   //2的sqetN次方 
      int result = (n-value)<<1; 
      if(result==0){
          cout<<n<<endl; 
      }
       else
         cout<<result<<endl;  
       
      cout<<endl;
}


#阿里巴巴##网易##完美世界##C++工程师#
全部评论
这个题目用一个队列模拟一下就搞定了
1 回复 分享
发布于 2017-10-01 17:54
由此得出输出是第几个数的公式为:      (n-2^((int)sqrt(n))*2 应该是      (n-2^(log(n)取上整+1)*2 吧? 跟平方根没啥关系
点赞 回复 分享
发布于 2018-09-07 16:40
但是队列弹出数的时候需要移动整个队列的数,很消耗性能的。我是想着能够找到一种比用队列模拟更好的方法
点赞 回复 分享
发布于 2017-10-01 18:06
我的是晚上九点的。。
点赞 回复 分享
发布于 2017-09-29 14:28
补充一下 :找规律输出的是原数组中第几个数的位置,要得到输出的是哪个数,再根据位置去找原数组中的那个数即可
点赞 回复 分享
发布于 2017-09-29 14:24
很多人都是用约瑟夫环做的
点赞 回复 分享
发布于 2017-09-29 14:24

相关推荐

评论
2
12
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务