著名IT笔试题 C++实现
C++程序员Carea
十年一线开发经验,热爱 C++ ,热爱编程
展开
-
C++笔试题 String类的实现 三大复制控制函数
class String{ String(const String& str); String(const char* char); String& operaotr=(const String& other); ~String(void)};原创 2011-08-08 10:37:08 · 2369 阅读 · 1 评论 -
微软笔试题 求出现次数超过一半的元素
此题为微软面试一百题中的一题。用动态规划算法可以实现在线性时间内完成任务。思路就是假设第一个元素就是要找的那个result元素。最终这个元素出现的次数一定比其他所有元素出现的次数还多。每次遍历到一个新元素的时候就将result的计数减少或者增加,或者更新result。最终求出result。代码和结果如下: timer t; int a[]={1,2,1,3,1,8,1,2,3原创 2012-07-22 15:18:34 · 1905 阅读 · 0 评论 -
动态规划算法 (微软笔试题,求连续子数组的最大和)
这个问题一般用动态规划算法可以再线性时间内得到解。动态规划就是将大问题化为小问题,先把小问题解决了,最后大问题也就解决了。本问题是从一个元素开始,到两个元素,最后到数组的全部元素来逐步解决的int main( void ) { timer t; //top_k_words(); int a[]={1,2,3,-8,1,2,3,4,-99,100,101,-400,100原创 2012-07-22 14:40:50 · 1905 阅读 · 0 评论 -
TOP K算法(微软笔试题 统计英文电子书中出现次数最多的k个单词)
在v_JULY_v的文章中找到了这个问题的解法后用C++实现了一下,发现C++的代码非常的简洁。主要用到了标准库中的hash_map,优先级队列priority_queue。 算法的思路是:从头到尾遍历文件,从文件中读取遍历到的每一个单词。把遍历到的单词放到hash_map中,并统计这个单词出现的次数。遍历hash_map,将遍历到的单词的出现次数放到优先级队列中。当原创 2012-07-22 12:00:29 · 5547 阅读 · 0 评论 -
动态规划算法(微软一面笔试题:股票交易,O(N)时间复杂度O(1)空间复杂度)
自从暑假面试被鄙视之后,回来就经常想这个问题,到今天应该快两个月了。在这个下午,我又拿出草稿纸,总算找到了思路,把它给搞定了。就像一个心愿一样,完结了。问题是这样的,如同题目:原题就不赘述了,化简之后的问题就是在数组中找到两个元素,计算后面的元素减去前面的元素的差。求出所有差的最大值。(你可以认为你在炒股票,买入价格和卖出价格就是你的盈利)当时想到的方法是,如果一遍遍历这个数组,找到MAX,MIN原创 2012-08-24 15:18:13 · 8826 阅读 · 9 评论 -
C++合并两个有序的二进制文件
有时候很多基于文件的外部排序算法都需要合并两个有序的文件。下面就给出简单的C++实现方法。具体思路和合并两个有序的单链表的思路是一样的。void merge_file(const string& file_in_name1,const string& file_in_name2,const string& file_out_name){ //打开两个输入文件和一个输出文件 ifst原创 2012-08-16 10:15:09 · 5369 阅读 · 2 评论 -
排列组合算法(微软笔试题:输出1到n的全排列)
这里希望能更清楚,如果不好,欢迎拍砖。12345的next是12354,从这里我们可以看出,next就是将大数字提到小数字的前面,即对调一个升序的两个数字。 而对于更一般的情况,对如下排列234578 改变任意个升序的数字对都可以得到后续的排列。哪一个才是next呢? 当有多个升序的数对事,在高位对调,低位的对调会被跳过。我们应该先把低位的都改对调完再对调高位的。原创 2012-08-09 14:36:40 · 4529 阅读 · 0 评论 -
数独求解
#include using namespace std;#include #include const int MAX_SIZE = 9;//int result[MAX_SIZE][MAX_SIZE] = { // {1, 2, 3, 4, 5, 6, 7, 8, 9}, // {4, 6, 7, 1, 8, 9, 3, 2, 5}, // {5, 8原创 2016-11-18 12:36:39 · 908 阅读 · 0 评论 -
C++ std::list实现大整数加法运算
#pragma once#include #include #include using namespace std;class CBigInt{public: CBigInt(void); CBigInt(const string& _str); CBigInt& Set(const string& _str); ~CBigInt(void);原创 2016-11-18 12:40:25 · 1430 阅读 · 0 评论 -
递归算法(求n的加法组合,将一个整数拆分成多个整数相加的形式, O(N)时间,O(N)空间)4.0版
网上的多种解法比较复杂,本文用递归方法,22行代码搞定。时间和空间复杂度已经降到最低! //n give the sum of a list,and start give the first number of the listvoid f(int n,list& list1,int start) { if (n==1) { //输出前缀,当然前缀肯定也全部都是1原创 2012-09-27 11:50:31 · 17645 阅读 · 11 评论 -
微软笔试题 跳台阶问题
题目 : 一个台阶有n个台阶。每次可以上一个台阶,也可以上两个台阶。有多少种不同的上法?可以这么递归的来考虑,第一次跳一个台阶,这种情况的跳法总数是后面的跳法总数f(n-1);第一次跳两个台阶,这种情况下跳法总数是后面的跳法总数f(n-2);所以全部的跳法数就是f(n)=f(n-1)+f(n-2),n>2f(1)=1,n=1f(2)=2;n=2这正是Fibonacci数列,可原创 2012-08-10 22:16:55 · 2115 阅读 · 2 评论 -
微软笔试题 大型文件外部排序(二路归并和k路归并的实现和比较)
这两种排序方法都是先将一个无序的大的外部文件,分成若干块,分别读到内存中。将每一块都先排好序,放到一个新的外部文件中。二路归并的思路是每次将外部排序的文件两两合并,变成一个二倍大小的文件,然后对二倍大小的文件继续两两合并。直到最终合并为一个文件为止。k路归并是将外部排好序的子文件一次合并。先在各个文件中取出第一个数据,放到一个优先级队列中。然后选出最小的数据输出到外部结果文件里。并从最原创 2012-08-20 21:45:41 · 5025 阅读 · 0 评论 -
微软暑期实习笔试题 合并两个有序单链表
当时做这一题的时候就感觉有点繁琐,其实也不难。感觉面试官就是想看看自己的基础水平在哪里。 当自己不想写,有必须要写的时候才发现很繁琐。原来打算20行都不要,却越写越多,有的地方居然挤不下。最后只能时间到了,我还在纠结,因为给的是5分钟的时间。我自己也没想到居然没搞定。我还介绍了思路,但显然不是面试官想要的结果。他认为时间应该是绰绰有余的。回来之后痛定思痛!自己静下心来,慢慢写,10分钟原创 2012-07-31 10:43:02 · 2409 阅读 · 6 评论 -
删除字符串中的某些字母O(N)时间O(1)空间
这个方法是用了hash方法,将要删除的字母先用数组下表表示,如果要删除,则标记为1.不需要删除的标记为0这个方法在删除元素的时候比较巧妙,它对要删除的字符并不主动删除,而是将空间留在那里,让后面不需要被删除的字符去覆盖。具体实现如下:string& f(string& str,const string& deles){ bitset hash; hash.reset();原创 2012-09-20 15:16:06 · 1564 阅读 · 0 评论 -
判断栈的出栈和入栈序列O(N)时间O(N)空间
给出一个序列式栈的入栈序列,但是在入栈的过程中可能会有元素出栈,问最后的出栈序列是否可能出现,思路就是你想的那样。不再赘述,实在打字麻烦,看代码页很容易看的。就不写了。void init_queue(queue& q , const int a[],const int n){ for (unsigned i=0;i<n;i++) { q.push(a[i]); }原创 2012-09-20 18:31:50 · 3229 阅读 · 0 评论 -
sizeof作用在struct和union上的情况,经典解答
请牢记以下3条原则:(在没有#pragma pack宏的情况下)1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整转载 2012-09-22 22:02:58 · 1596 阅读 · 0 评论 -
指针与多维数组的那点事儿
最近笔试经常遇到这个p+1的问题,,还是《C++ Primer》说的明白:在C/C++中没有多维数组,只有元素是数组的数组。关于指针加1移动的距离:一个指针加一移动的距离是它指向的元素在内存中的大小。所以指向int的指针加1走过了4个字节;指向int[n]的指针加1走过了n*4个字节;以此类推。*p的类型是p所指向的元素的类型,所以*p+1是p所指向的素的类型加以之后的结果原创 2012-10-26 11:11:06 · 1500 阅读 · 0 评论 -
(科大讯飞)删除字符串中的连续空格(只保留一个),O(n)时间复杂度,O(1)空间复杂度
昨天(2012/10/23)晚上,南大,科大讯飞宣讲加笔试,题目很基础,也很简单,可是。。。没认真弄。挂了,回来痛定思痛,今天南邮打算再去跑一趟。 另一个哥们由于没有使用内层循环(潜意识告诉他,那样会增加复杂度,其实不会),使用了四个分支判断,而我当时考虑的实现的需要,用了最笨的方法,涉及大量的元素移动(太烂了,居然当时出来还沾沾自喜,真是丢人)。 这里参考了《算法原创 2012-10-24 11:02:23 · 6843 阅读 · 8 评论 -
(科大讯飞)实现一个类:不能被继承,而且最多只能有三个实例
当时看到这个题目就想到了单例模式,可是不知道在哪里判断次数,刚开始打算放到构造函数里抛出异常的,现在想想还是没有真正理解单例模式。class A{public: //this function is static ! static A* instance(void) { if (n<3) { return new A; } else return (A*)0;原创 2012-10-24 11:20:43 · 3130 阅读 · 1 评论 -
(笔试题)C++删除文件中的注释
//本文算法思想是对C++注释的分类讨论// (1) a/b// (2) //a // (3) /*a*/// (4) a*b//由上述四种情况可以看出在源码中第一次遇到'/'时须分(1),(2),(3)三种情况来讨论,其他均直接输出字符即可。//一旦第一次发现'/'则继续读入并处理,只需再读入一个字符即可分辨(1),(2)和(3).他们分别是//'b'一般字符原创 2010-10-15 22:58:00 · 3884 阅读 · 7 评论 -
微软笔试题 给一个包含10^7个整数的大文件排序
这个题目有一个前提条件,大文件的中的数据有有一个特点,那就是不存在重复的数据。就算是重复的数据,也只让你求出去除重复之后的那些数据的排序结果。 如果题目变成了这样,我们就可以考虑创建一个大的数组。数组的下表表示一个整数,数组的内容在我遍历文件的时候再赋值。如果数组下标代表的那个整数存在,我们就把数组的这个元素赋值为1,否则赋值为0.这样我们就可以再次遍历数组,把元素的值为1的那原创 2012-08-11 01:25:19 · 2227 阅读 · 0 评论 -
C++队列模拟银行排队叫号
原题如下:大家可以根据题目自己做一遍,作为对基础的夯实和对C++学习的最佳实践。说明:1 这个题目的第一问老师给出了伪代码,伪代码是很关键的,因为这里面没有多线程技术。为了能够用最基本的C++语句完成多个队列的协作(等待队列,服务队列,完成队列)伪代码可以说给出了程序的骨架。2 附加题的难度还是不小的,工作量要建立在第一问的框架和基础设施上,如果第一问的程序写的好,第二问就可以较顺利的...原创 2017-10-30 20:25:14 · 6453 阅读 · 1 评论