
《剑指offer》刷题
yvhqbat
whuster
展开
-
广义表(待补充)
广义表原创 2016-04-01 22:21:08 · 331 阅读 · 0 评论 -
面试题04:找出两个单向链表的第一个公共节点
问题描述:给定两个单向链表,找出它们的第一个公共节点。链表的节点定义如下:struct ListNode{ int Key; ListNode* pNext;};ListNode* FindFirstCommonNode(ListNode* list1,ListNode* list2){ ListNode* pCommon=NULL; i原创 2016-04-17 21:22:48 · 704 阅读 · 0 评论 -
面试题23:从上往下打印二叉树(层序遍历) && 面试题25:二叉树中和为某一值的路径
/************************************************************************* > File Name: inorder-tree.cpp > Author: liudong > Mail: liudonwho@126.com > Created Time: Thu 28 Apr 2016 12:原创 2016-04-28 15:35:17 · 453 阅读 · 0 评论 -
面试题18:树的子结构
/************************************************************************* > File Name: subtree.cpp > Author: liudong > Mail: liudonwho@126.com > Created Time: Fri 22 Apr 2016 10:40:35原创 2016-04-25 10:26:42 · 318 阅读 · 0 评论 -
面试题05:求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,-4,7,2,因此输出为该子数组的和18。//求子数组的最大和int MaxSubArray(int a[],int n){ if(a==NUL原创 2016-04-18 22:52:52 · 326 阅读 · 0 评论 -
面试题06:在二元树中找出和为某一值的所有路径(未完待续)
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。 例如输入整数22和如下二元树 10 / \ 5 12 / \ 4 7 则打印出两条路径: 10,12和10,5, 7。 二元树结点的数据结构定义为:struct BinaryTreeNode原创 2016-04-18 23:31:02 · 324 阅读 · 0 评论 -
面试题45:圆圈中最后剩下的数字(约瑟夫环问题)
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。1、大部分面试官只要求应聘者基于环形链表的方法解决这个问题。/************************************************原创 2016-05-04 09:35:33 · 881 阅读 · 0 评论 -
面试题17:合并两个排序链表
/************************************************************************* > Created Time: Tue 17 May 2016 05:20:54 PM PKT ************************************************************************/原创 2016-05-17 21:03:36 · 295 阅读 · 0 评论 -
面试题49:把字符串转换成整数
转自《剑指offer》// StringToInt.cpp : Defines the entry point for the console application.//// 《剑指Offer——名企面试官精讲典型编程题》代码// 著作权所有者:何海涛#include "stdafx.h"#include <stdio.h>#include <stdlib.h>long long StrT转载 2016-05-19 10:28:39 · 842 阅读 · 0 评论 -
面试题40:数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 分析: 1. 如果遍历这个数组,使用哈希数组来保存每个数字出现的次数,则:事件复杂度是O(N),空间复杂度O(N)。 2. 如果一个整型数组里除了一个数字之外,其他的数字都出现了两次。则可以使用异或操作符,int find(int原创 2016-06-02 15:11:14 · 315 阅读 · 0 评论 -
面试题41:和为s的两个数字 VS 和为s的连续正数序列
题目1:输入一个递增排序的数组和一个数字 s,在数组中查找两个数,得它们的和正好是 s。如果有多对数字的和等于 s,输出任意一对即可。 例如:输入数组{1 、2 、4、7 、11 、15 }和数字 15。由于 4+11 = 15 ,因此输出 4 和 11 。/*******************************************************************原创 2016-06-02 15:52:51 · 422 阅读 · 0 评论 -
面试题42:翻转单词顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。 例如:输入“I am a student.”,则输出“student. a am I”。/************************************************************************* > Fi原创 2016-06-03 16:01:34 · 247 阅读 · 0 评论 -
面试题42-2:左旋转字符串
题目: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab。 请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。 ab|cdef –> fedc|ba –>cdef|ab #include <cassert>#include <iostream>using n原创 2016-06-08 14:30:29 · 346 阅读 · 0 评论 -
面试题43:n个骰(tou)子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。 分析:我们可以考虑用两个数组来存储骰子点数每一总数出现的次数。在一次循环中,第一个数组中的第n个数字表示骰子和为n出现的次数。那么在下一循环中,我们加上一个新的骰子。那么此时和为n的骰子出现的次数,应该等于上一次循环中骰子点数和为n-1、n-2、n-3、n-4、n-5与n-6的总和。所以我原创 2016-06-12 20:51:20 · 555 阅读 · 0 评论 -
面试题44:扑克牌的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。//"poker.h"#include <iostream>using std::cout;using std::endl;using std::ends;//从小到大排序void bubble_sort(int a[], int原创 2016-06-13 19:17:47 · 494 阅读 · 0 评论 -
面试题47:不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 分析:因为不能用加减乘除,所有很容易想到转到位运算。 a^b //不带进位加 a&b //看哪几位有进位,进位左移一位,所以需要(a&b)<<1递归int Add(int a, int b){ if (b == 0){ return a; } in原创 2016-06-14 09:44:59 · 438 阅读 · 0 评论 -
面试题03:反转链表
题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:struct List{ int value; ListNode* next;};1、循环方法//反转链表List* ReverseList(List* pHead){ List* pNode = pHead; List* pPre = NULL; L原创 2016-04-15 14:04:44 · 238 阅读 · 0 评论 -
面试题02:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 分析: 1,如果无序,是不是可以先把数组中所有这些数字进行排序,最常用的快速排序O(N*logN)即可。然后把那个出现次数超过一半的数字直接输出,题目便解答完成了。总的时间复杂度为O(N*logN)。 一个数字在数组中的出现次数超过了一半,那么在已排好序的数组索引的N/2处(从零开始编号),就一定是这个数字。自此,我们只需要对原创 2016-04-17 20:25:41 · 366 阅读 · 0 评论 -
面试题01:二元查找树转变成排序的双向链
目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何 新的结点,只调整指针的指向。 比如将二元查找树10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16#include <iostream>using namespace std;struct Node{ int value原创 2016-04-16 23:49:46 · 445 阅读 · 0 评论 -
数制转换(十进制、二进制、八进制、十六进制)
十进制整数N向其它进制数d(二、 八、 十六)的转换是计算机实现计算的基本问题。 转换法则: n=(n div d)*d+n mod d 其中: div为整除运算,mod为求余运算 例如 (1348)10= (2504)8, 其运算过程如下: n n div 8 n mod 8 1348原创 2016-04-02 10:35:07 · 1944 阅读 · 0 评论 -
最大公约数
1、辗转相除法 也叫欧几里德算法。//迭代法int GCD1(int a,int b) //GreatestCommonDivisor{ /*if(b==0) { return a; } else { int tem=a%b; return GCD(b,tmp); }*/ return b原创 2016-04-03 11:17:11 · 365 阅读 · 0 评论 -
有符号数和无符号数之间的转换
有如下程序段:char ch=-1;printf(“%02x,%02x”,ch,(unsigned char)ch);则输出:A -1,-1 B ff,ff C ffffffff,ff D ff,ffffffff正确答案:C分析: 无符号数编码: 补码编码:有符号数和无符号数之间的转换的规则:数值可能会改变,但是位模式不变。 强制类型转换的结果保持位值不变,只是改变了解释这些位的方式。原创 2016-03-28 15:45:36 · 3944 阅读 · 0 评论 -
蛇形矩阵(百度2016实习招聘)
#include "stdafx.h"#include <iostream>#include <vector>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ int m,n; cin >>m >> n; vector<vector<int> > vec(m, vector<int>(n)); in原创 2016-04-04 11:52:39 · 254 阅读 · 0 评论 -
字符串的排列、组合
迭代方法1、全排列#include <iostream>using namespace std;void Swap(char* c1, char* c2){ char temp = *c1; *c1 = *c2; *c2 = temp;}void Permutation(char* str, char* begin){ if (*begin == '\0'){原创 2016-04-06 11:02:57 · 377 阅读 · 0 评论 -
二进制中1的个数
//整数n的二进制表示中1的个数int NumberOf1(int n){ int cnt = 0; while (n != 0){ cnt++; n = n&(n - 1); } return cnt;}测试int n = -1;cout << n << " has 1 is " << NumberOf1(n) << endl;原创 2016-04-06 11:45:46 · 212 阅读 · 0 评论 -
最小的K个数
题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。1、最简单的思路:对输入的n个整数排序,输出位于前面的K个数。 时间复杂度为O(nlogn)2、O(n)的算法,会修改输入的数组原创 2016-04-05 22:06:11 · 294 阅读 · 0 评论 -
插入排序
插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。//插入排序,从小到大void InsertSort(int a[], int n){ for (int i = 1; i < n; i++){ int temp = a[i]; for (int j原创 2016-04-06 17:33:14 · 237 阅读 · 0 评论 -
快速排序
快速排序算法的基本特性: 时间复杂度:O(n*lgn) 最坏:O(n^2) 空间复杂度:O(n*lgn) 不稳定。快速排序是一种排序算法,对包含n个数的输入数组,平均时间为O(nlgn),最坏情况是O(n^2)。 通常是用于排序的最佳选择。因为,基于比较的排序,最快也只能达到O(nlgn)。//快速排序void QuickSort(int a[], int left, int right原创 2016-04-06 17:29:56 · 218 阅读 · 0 评论 -
删除链表中等于给定值val的所有节点
(1)删除链表中等于给定值val的所有节点 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。 (2)删除链表中重复的结点 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 (3)从尾到头打印链原创 2016-04-06 22:02:28 · 2077 阅读 · 0 评论 -
希尔排序
基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。//希尔排序(属于插入排序),也叫缩小增量排序void ShellSort(int A[],int n){ int i,j,gap; for(gap=n/2;gap>0;gap/=2){ for(i=gap;i<n;i++原创 2016-04-13 11:26:28 · 264 阅读 · 0 评论 -
冒泡排序
冒泡排序是非常容易理解和实现,,以从小到大排序举例: 设数组长度为N。 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。 3.N=N-1,如果N不为0就重复前面二步,否则排序完成。//冒泡排序void Swap(int& a, int& b){ int t原创 2016-04-06 19:16:43 · 260 阅读 · 0 评论 -
串的模式匹配算法
1、Brute-Force模式匹配算法(暴力匹配) 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符; 如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被置为0。int In原创 2016-04-14 22:54:46 · 2274 阅读 · 0 评论 -
面试题35:第一个只出现一次的字符
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。/************************************************************************* > Created Time: Tue 10 May 2016 12:17:48 PM PKT *******************************原创 2016-05-10 15:49:19 · 278 阅读 · 0 评论 -
面试题32:在从1到n的正数中1出现的次数
1、方法一:class Solution1 {public: int NumberOf1OfN(int n) { int cnt=0; while(n!=0){ if(n%10==1){ cnt++; } n=n/10; }原创 2016-05-04 22:05:42 · 483 阅读 · 0 评论 -
面试题34:丑数
问题描述: 我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。方法一:遍历/************************************************************************* > Created Ti原创 2016-05-10 11:32:37 · 1015 阅读 · 0 评论 -
面试题47-2:不使用新的变量,交换两个变量的值
1. 基于加减法void swap(int &a,int &b){ a=a+b; b=a-b; //=a+b-b=a a=a-b; //=a+b-a=b}2. 基于异或运算void swap(int &a,int &b){ a=a^b; b=a^b; //=a^b^b=a a=a^b; //=a^b^a=b} 3. 使用新的变量vo原创 2016-06-14 09:58:57 · 637 阅读 · 0 评论