自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 面试题45:约瑟夫环

问题:1,2,3,......,n-1,n这n个数字排成一个圆圈,从数字1开始每次从这个圆圈里删除m个数字。求出这个圆圈里剩下的最后一个数字。思路:利用STL中的list来模拟这个操作。int Joseph(int n, int m){ list numbers; for(int i = 1; i <= n; i++) numbers.p

2017-03-07 09:17:37 197

原创 面试题42:翻转单词顺序,左旋转字符串

题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入"I am a student.",则输出"student. a am I"。思路:这个题目流传甚广,很多公司都多次拿来作面试题。首先,我们先考虑如何将一个字符串给反转过来,void ReverseWord(char *pBegin, char *pEnd)

2017-03-06 15:44:36 218

原创 面试题41:和为s的两个数字,和为s的连续正数序列

题目一:输入一个递增排序的数组和数字,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。例如输入数组{1,2,4,7,11,15}和数字15,由于4+11=15,因此输出4和11。思路:可以利用2个指针,分别指向数组的第一个元素和最后的一个元素,如果两元素之和大于我们输入的和,则将第二个指针向左移一位,如果两元素之和小于我们输入的和,则将第一个指针向右移

2017-03-06 14:12:54 203

原创 面试题40:数组中只出现一次的数字

题目:一个整形数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路:利用异或的方法。假如一个数组中,除了一个数字只出现了一次之外,其他的所有数字都出现了两次,则可以让数组中的每个数字进行异或,最后的结果就是只出现一次的那个数。因为相同的两个数的每一位都一样,所以相同的两个数异或的结果为0。因此那些成对出现两次的

2017-03-06 09:55:09 286

原创 面试题38:数字在排序数组中出现的次数

问题:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。思路:因为数组是排序的,所以我们可以利用折半查找来找到我们要找的这个数字。找到这个数字之后,从左右两边依次开始继续检测,找到最左边和最右边的那个数字,相减就可以得到次数。

2017-03-01 21:33:07 181

原创 面试题37:两个单链表的第一个公共结点

题目:输入两个单链表,找出它们的第一个公共结点。链表结点定义如下。struct node{ int data; int *next;};思路1:如果两个链表有公共结点,则从那个公共结点开始,后面的结点都相同。则可以用较长链表的长度 - 较短链表的长度 = m,将较长链表的表头指针先往前走m步在同时将2

2017-03-01 19:11:45 170

原创 面试题35:第一个只出现一次的字符

题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出‘b’。思路1:如果检测每一个字符的时候,都将字符串从头到尾扫描一遍,则需要时间复杂度为O(n^2),效率太低。思路2:利用哈希表的思想。统计字符串中每个字符出现的次数。定义哈希表的键值(key)是所有字符(char类型有256种可能),定义实值(value)为该字符出现的次数。从头到尾扫描字符

2017-03-01 18:39:57 156

原创 面试题34:丑数

问题:我们把只含因子2,3和5的数称作丑数。求按从小到大的顺序的第n个丑数。例如6,8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当作第一个丑数。思路1:写一个函数来判断某数是不是丑数,然后在从1开始累加寻找,直到找到第n个丑数。bool IsUgly(int number){ while(number % 5 == 0) number = number

2017-03-01 18:04:47 217

原创 面试题30:最小的k个数

问题:输入n个数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。思路1:利用问题题29的思想,利用快速排序中的partition,找到第pivot为k-1的位置,则从第0个数到第k-1个数为是最小的k个数。此方法的时间复杂度为O(n)。(计算方法利用了等比数列求和)思路2:思路1的方法改变了原序列n个数的顺序,如果不改

2017-02-24 20:24:34 236

原创 面试题29:最小的第k个数

问题:输入n个数,找出其中最小的第k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的3个数字是3。思路:我们可以利用快速排序中的partition,每经历一趟partition后,会找到一个pivot,在pivot这个位置上的元素就是排序完后最终的位置。并且每趟partition后,在pivot位置左边的元素,都比在pivot这个位置的元素小。在pivot位置右边的元素,都

2017-02-24 15:54:03 185

原创 面试题28:全排列

问题:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba.思路1:利用STL中的next_permutation(...)来直接实现该功能。要包含头文件#include 。void STLnext_permutation(char *s1, int length){ d

2017-02-24 10:33:38 306

原创 面试题21:包含min函数的栈

问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop的时间复杂度都是O(1)。思路:使用一个辅助栈,辅助栈的栈顶始终是数据栈中最小的元素。比如数据栈3进栈,现在3是最小值,我们也把这个最小值压入辅助栈。数据栈4进栈,此时数据栈中依然3是最小值,则将3继续压入辅助栈。数据栈2进栈,此时2是最小值,将2压入辅助栈。此事数据栈中

2017-02-23 18:55:16 187

原创 面试题20:顺时针打印矩阵

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如      则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10思路:可以看做不断打印几个依次缩小的圆圈。第一个圆圈的起点是(1,1),第二个是(2,2),依次类推。int main(int argc, const char * argv[]) { int

2017-02-23 17:49:43 201

原创 面试题17:合并两个排序的链表

问题:输入两个递增的单链表,合并这两个链表使新链表中的结点仍然是按照递增排序的。例如下图所示。思路:我们先判断哪个结点是新链表中的第一个结点,将指针p1p2指向两个链表的头结点,因为p1指向结点的元素比p2指向的要小,所以L1中的结点为新链表中的第一个结点,并将p1向后挪一个。然后我们继续从这2个链表中,找到较小的那一个结点继续插入到新链表的尾部,直至两个链表同时为

2017-02-22 21:07:13 274

原创 面试题15:链表中倒数第k个结点

问题:输入一个单链表,输出该链表中倒数第k个结点。例如一个链表从头结点开始,各结点的值依次为1,2,3,4,5,6。倒数第3个结点的值为4。思路:看到此题的第一想法,应该是想将链表从头到尾遍历一次,统计出链表有多少个结点,到处第k个结点在正数n-k+1处,在重新遍历一次,遍历到n-k+1个结点处,就是我们需要找到的那个结点。但是这样子的解决方法,需要对链表遍历2次,面试官肯定会不满意,我们

2017-02-22 19:31:08 160

原创 面试题16:反转链表

问题:定义一个函数,输入一个链表的表头结点,反转该链表并输出反转后的头结点。链表结点定义如下:struct Node{ int data; Node* next;};思路:假设该链表为a->b->c->d->e,根据题意,需要将链表变为a当我们使用2个指针的时候p1,p2。若将p1指向a,将p2指向b,需要执行b->next = a; 此时链表变为ad->e

2017-02-22 19:13:00 154

原创 面试题14:调整数组顺序使奇数位在偶数位前面

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。思路1:一拿到这个题的时候,想法应该是从头到尾开始遍历,如果指向的是偶数,则使偶数后面的所有元素都向前挪一位,然后将指向的这个偶数放到数组的最后一位。这样每碰到一个偶数的时候,就需要移动O(n)个数字,因此总的时间复杂度是O(n^2)。思路2:时间复杂度O(

2017-02-21 21:10:22 341

原创 面试题13:在O(1)时间内删除链表结点

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。struct ListNode{ int m_nValue; ListNode* m_pNext;};思路;如果按照常规方法,需要从头指针开始遍历,找到要删除的节点指针的前一个指针,使前一个指针在指向要删除结点的下一个结点,则需要时间复杂度为O(n)。设要删除的节点指针为i,结点指针顺序为x

2017-02-21 20:08:02 188

原创 关联式容器:set和map

set1.set的底层由RB-tree来实现的2.set中不允许有两个元素有相同的键值,所有元素都会根据元素的键值自动被排序3.不能通过set的迭代器来改变set的元素值(set::iterator被定义为底层RB-tree的const_iterator,杜绝写入操作)int main(int argc, const char * argv[]) { int a[

2017-02-21 14:53:14 196

原创 面试题12:打印1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1,2,3,4,5一直到最大的3位数999。思路:看到题目的第一反应,应该是想到先把这个最大的数给找出来,然后在从1一直输出到这个数。void printToMax(int n){ int maxNum = 1; for(int i = 0; i < n; ++i) {

2017-02-19 10:28:41 291

原创 面试题10:二进制中1的个数

题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,则函数输出2。思路:看到赐题的第一个反应,想到的是把这个整数和1相与&,相与的结果如果是1的话,就说明二进制中最后一位是1。然后将这个整数右移一位>>,将右移之后的结果继续和1相与。直到这个这个书变成0为止,就可以统计出有多少个1了。但是这个做法有个问题,这个做法默

2017-02-14 15:15:03 232

原创 面试题9:斐波那契数列

问题1:写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列:当n=0时,f(0) = 0。当n=1时,f(1) = 1,当n>1时,f(n) = f(n-1) + f(n-2)。效率很低的解法:利用递归递归可以解决斐波那契数列,但是因为递归中,会造成重复求f(n)的很多项,并且每一次函数调用时,都会在内存栈中分配空间,可能会造成栈溢出。所以这个时候,更好的办法是利用循

2017-02-14 14:05:01 351

原创 面试题8:旋转数组中最小的数字

题目:把一个数组中最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转数组,该数组的最小值为1。分析:要从题目中剖析出更多的信息,可以将旋转数组看成是2个递增序列,而前面一个递增序列的最小值,比后面一个递增序列的最大值还要大。这样描述问题的话,就很容易解决了。同

2017-02-09 16:00:05 356

原创 面试题7-2:时间复杂度为O(n)的排序

问题:请实现一个排序算法,要求排序一个公司几万名员工的年龄,要求时间复杂度为O(n)。思路:要排序的序列元素个数比较大,不适合用传统的排序方法,但问题的要求是排序员工的年龄,也就是说,每个元素都在一个很小的范围之内(1-100)。又要求时间复杂度为O(n),但没有要求空间复杂度,所以此时我们应该想到利用一段辅助空间来帮助排序。利用一个timesOfAge[100]的数组,每个位置存储该

2017-02-09 00:38:33 3228 1

原创 面试题7-1:快速排序

快速排序由2个函数来共同完成,第一个函数为partition,第二个函数为quicksort。void quicksort(int data[],int low, int high){ int index; if(low < high) { index = partition(data, length, low, high); quic

2017-02-08 22:41:42 618

原创 面试题7:用两个栈实现一个队列

需要用到栈1(s1)和栈2(s2),初始状态2个栈都为空。要进行入队操作时:若s2为空,则将该元素直接push到s1中。    若s2不为空,将s2的元素依次出栈,每出栈一个元素就将该元素入栈到s1中。当s2中的元素全部出栈完毕时,即s2为空栈时,再将要入队的元素入栈s1。要进行出队操作时:若s1为空,则将s2中栈顶元素出栈。 若s1不为空,则将s1的元素依次出栈,每出栈一个元素就

2017-02-07 23:01:02 154

原创 面试题5:从尾到头打印链表

#include #include #include using namespace std;struct ListNode{ int m_nValue; ListNode *m_pNext;};ListNode* creatList(int value);void AddToTail(ListNode **pHead, int value);void Sho

2016-11-02 19:57:47 155

原创 面试题4:替换空格

#include #include using namespace std;void replace_space(char s[], int maxLength);int main(){ char str[16] = "we are happy."; replace_space(str, 16); printf("%s\n", str); retur

2016-11-02 15:27:07 152

原创 指针和const

int main(){//指向常量的指针 const int a = 10; const int aa = 20; const int *p1 = &a; p1 = &aa; //常量指针 int b = 10; int *const p2 = &b; *p2 = 20;

2016-04-25 11:11:07 141

原创 多线程

Test2

2016-04-25 10:26:36 123

原创 网络编程

Test2

2016-04-25 10:26:08 130

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除