有道笔试之后的自我反省

有道笔试过了两天了,我其实当时就想着写篇文章好好反省下。这个编程题一道题都没AC,如果我要归咎责任,掩人耳目,保留面子,那么我会说第一道题把我卡住了,而且第一题的样例有误。但是诚实地说,是我的编程方法不对。

编程,你一定要知道解决问题的算法,知道了算法之后实现是第二步。所以假若没有想到算法就编程,那么就不可能顺利AC。而编程的规则,大部分是从题目翻译。这点考验理解力和算法基础。规则,你或者说算法很重要。有了算法之后实现就容易多了。而我在有道笔试的时候,自己主观想象的算法当总数为4时,没问题。是10就完全不对。原因很简单,没去理解问题,直接以最简单的样例来拼凑规则,这样拼凑出来的算法就很多不一定了。确实,样例的最后一个一直过不了。也好在我静下心来,只为自己的一道编程题AC而努力。最后,算法算是正确,但由于时间不够了,边界条件并未处理好。下面是题目:

小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序:

  while(!Q.empty())              //队列不空,执行循环
       {
          int x=Q.front();            //取出当前队头的值x
          Q.pop();                 //弹出当前队头

          Q.push(x);               //把x放入队尾

          x = Q.front();              //取出这时候队头的值

          printf("%d\n",x);          //输出x

          Q.pop();                 //弹出这时候的队头
}

做取出队头的值操作的时候,并不弹出当前队头。

小明同学发现,这段程序恰好按顺序输出了1,2,3,...,n。现在小明想让你构造出原始的队列,你能做到吗?[注:原题样例第三行5有错,应该为3,以下已修正]

输入描述:

第一行一个整数T(T ≤ 100)表示数据组数,每组数据输入一个数n(1 ≤ n ≤ 100000),输入的所有n之和不超过200000。

输出描述:

对于每组数据,输出一行,表示原始的队列。数字之间用一个空格隔开,不要在行末输出多余的空格.

输入例子:

4

1

2

3

10

输出例子:

1

2 1

2 1 3

8 1 6 2 10 3 7 4 9 5

我的代码如下:

#include<queue>
#include<stack>
#include<vector>
#include<iostream>
using namespace std;

void PrintOrigin(int n)
{
      queue<int>ret;
	  queue<int>a;
	  int p=n;
	  ret.push(n);
      while(p>0)
      {
		    p--;
			if(p>0)a.push(p);
		    a.push(ret.back());

			while(ret.size()>1)
			{
			    int k=ret.front();
				ret.pop();
				a.push(k);
			}
			ret.pop();
			if(p==0)break;
			while(!a.empty())
			{
				int k=a.front();
				a.pop();
		   	    ret.push(k);
			}
      }

	  while(!a.empty())
	  {
          int k=a.front();
		  a.pop();
		  printf("%d ",k);
	  }
}

int main()
{
      int N;
      while(cin>>N)
      {
            while(N--)
            {
                  int n;
                  cin>>n;
                  PrintOrigin(n);
                  printf("\n");
            }
      }
      return 0;
}

这个代码提交之后,未能在规定时间内完成任务。也是我用了两个队列不停地push和pop,这样很浪费操作时间。果然,再看算法,好像只用一个动态增长的数组,只用增加元素,挪动元素即可。这样,就有了如下代码:

#include<queue>
#include<stack>
#include<vector>
#include<iostream>
using namespace std;

void PrintOrigin(int n)
{
     vector<int>ret;
	 ret.push_back(n);
	 int tmp=n;
	 int i=0;
	 if(n==1)
		 {
			 printf("1");
			 return;
	 }
	 tmp--;
	 ret.push_back(tmp);
	 tmp--;
	 i++;
	 if(n==2)
		 {
			 printf("2 1");
			 return;
	 }
	 while(tmp>=0)
	 {
		 if(tmp>0)ret.push_back(tmp);
		 i++;
         int k=ret[0];
		 int p=i-1;
		 int begin=0;
		 while(begin<p)
		 {
			 ret[begin]=ret[begin+1];
			 begin++;
		 }
		 ret[i-1]=k;
		 tmp--;
	 }

	 int nr=ret.size();
	 for(int i=nr-1;i>=0;i--)
         if(i==0)printf("%d",ret[i]);
		 else printf("%d ",ret[i]);

}

int main()
{
      int N;
      while(cin>>N)
      {
            while(N--)
            {
                  int n;
                  cin>>n;
                  PrintOrigin(n);
                  printf("\n");
            }
      }
      return 0;
}

写这篇文章的目的,一是提醒自己编程时必须已经有解法,如果没有,要继续去寻求规则。二是要注意编程的一些技巧,如边界条件和优化等。

时间: 2024-12-27 16:03:43

有道笔试之后的自我反省的相关文章

网易笔试之后的自我反省

网易笔试过后,心里空空的.下来也和同学们交流,可能大家以为我比较水,在我谈到写那个大数类的时候,直接否认了我的分段加法思想.虽然被否认,但是我却不能懈怠,更不能因此沮丧或者自我否定.我应该在质疑声中证明自己.我也可以,而且8月份为了拿到offer,我开始拼了! 首先说一下选择题吧,我的知识面有所扩展,但是mysql.linux方面的知识欠缺的比较多.设计模式我之前看过专栏:设计模式.但是没总结.TCP/IP协议我也是看了vamei大神的总结,整体理解还算行,但是实现细节就比较欠缺了. 说说编程题

2017年度计划中期自我反省

(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/70998871冷血之心的博客) 时间的脚步总是如此匆忙,依稀记得16年末CSDN推出的征文活动.为了对自己今后一年有个更好的规划,写了一篇2016年的总结<丰富多彩的2016-未来属于我>.如今时间过去大约有一半,现在进行中期自我反省,希望在接下来的半年可以更好的进步.当我定下目标,许下承诺,吹下牛逼的时候,是2016年12月.距离2018届校园招聘尘埃落定(20

网易有道笔试总结

第一题是给你一堆坐标,找出里面可以组成矩形的点并且计算面积?忘记了,当时题目扫了一眼就直接跳过了... 第二题是一个队列中元素进行一些列的操作,输出是1,2,3,4....n按顺输出,问你原来的序列是多少. 这个其实就是每次都跳过一个可用位置然后在下一个位置放入数字,如果到达容器尾部,那么再从头开始搜索,知道全部位置都放了数字. 简直天杀的,这个最后我调出来超时了2分钟,结果自动交卷了 T   T码代码的速度很重要啊,还有OJ平台是真的烂,笔试的平台感觉一个比一个烂! 代码如下: #includ

分享两道笔试题目

前几天,给成都的某家公司投了个简历,给发了两道笔试题目,与大家分享一下.附上自己的解题过程,写得不好的地方,还请博友多多指教. 一 .  设计程序输出销售及收费清单 一个电商平台对在其平台之上销售的除了书籍.食品以及药物以外的商品收取 10% 的费用.而对于进口的商品则额外收取 5% 的附加费用.对于平台抽取的费用计算时,舍入的规则是:对于 n% 抽取率,价格为 p的商品, np/100 的值就近舍入到 0.05(如: 7.125 -> 7.15, 6.66 -> 6.70 ). 卖家卖出一些

杂谈---一个项目经理的自我反省

引言 说起来,LZ升迁也快半年了,这半年多里,也算是久经沙场.见识了各式各样的人,也见识了各式各样的事,有勾心斗角,也有令人欣慰的事情.当初做程序猿时的单纯已经一去不复返,尽管无限怀念,但生活是要往前走的. 这一段时间里,糟心的事非常多,尽管LZ承担了很多压力,但LZ也知道,自己的表现其实有很多有待加强的地方.但是人的习惯是非常可怕的,有的时候改变其实很困难.这里LZ就自己认为所犯过的失误做一个罗列,算是对自己的警告.如果有与LZ相似的猿友,也可以共勉. 凡事爱较真 LZ觉得这是自己最大的一个毛

一个菜鸟的自我反省

一直以来都想写一篇自我反省的文章了,从毕业到现在差不多有两年的时间了,两年的时间除了年龄和体重,别的好像也没有什么长进. 去年的时候,经历一点小小的挫折,当时感觉人生都暗淡无光了,整日浑浑噩噩的.最后辞职,去西藏呆了一个多月,美名其曰,拯救自己堕落不堪的过往.现在想来,当时还真 是幼稚的不得了,谁的过去又没有傻逼过呢? 大家莫笑,工作这么长时间,我的水平也就是一般般,对于新技术也不是很感冒,只有用到的时候,才会去看两眼. 技术大牛对我来说,如果用时间来衡量的话,大概会是一万年吧. 对于一名菜鸟程

腾讯、网易有道和阿里的笔试分享及自我总结

声明:本人Android移动开发岗 腾讯:考的很杂 选择题(25题不定项):考的包括: 编译原理两题, 计算机网络一两题(私网地址), C++若干, IOS开发一两题, 还有二叉树两三题,先后序遍历,求深度 jvm也有一题, 概率论一两题, JavaScript一题, 还有C语言(包括指针数组,数组指针,指针函数之类的)也挺多的 更多的是看程序求输出. 大题: 1,10亿QQ号用Set和Vector两个容器来删除奇数号 2,猴子摘香蕉,一次可以摘一根或两根,求摘50根有几种摘法(斐波那契数列)

【转】腾讯、网易有道和阿里的笔试分享及自我总结

声明:本人Android移动开发岗 腾讯:考的很杂 选择题(25题不定项):考的包括: 编译原理两题, 计算机网络一两题(私网地址), C++若干, IOS开发一两题, 还有二叉树两三题,先后序遍历,求深度 jvm也有一题, 概率论一两题, JavaScript一题, 还有C语言(包括指针数组,数组指针,指针函数之类的)也挺多的 更多的是看程序求输出. 大题: 1,10亿QQ号用Set和Vector两个容器来删除奇数号 2,猴子摘香蕉,一次可以摘一根或两根,求摘50根有几种摘法(斐波那契数列)

自我反省-巩固基础知识

中午吃饭前小小的反省了现阶段自己出现的问题,晚上再来谈下自己对于后期学习的一个粗陋的规划,即标题中的巩固基础知识. 两个月的学习,暴露出来的问题可以用与日俱增来形容,寻求与之对应的解决方式则是举步维艰.但是,分清主次.权衡轻重,从自身的实际情况出发,个人认为巩固基础知识才是当务之急,重中之重.以自己目前基础知识松松垮垮.毫无结构可言的境地,是无法去实现后面项目演练中快速.高效的完成任务的这样的目标的.因此,在课后的空余时间里重新开始,让自己对基础知识和简单的技巧的掌握和熟练度得到提升,尽可能的使