
剑指offer
文章平均质量分 58
曲小鑫
我的学习笔记
展开
-
最后一个字符 : 找出只出现一次的第一个字符
试题来源:http://www.nowcoder.com/test/151724/begin正在挑战一个CrackMe的你,把需要填写的前面几位密码都正确猜出了,可是这最后一位密码,好像藏得有点深。CrackMe的作者还挑衅般的在里面藏了个.tar.gz文件,解压缩出来,里面写道你要的最后一个字符就在下面这个字符串里。这个字符是下面整个字符串中第一个只出现一次的字符。 (比如,串是abaccdeff原创 2015-08-13 16:46:35 · 2157 阅读 · 1 评论 -
58 - 二叉树的中序遍历的下一个节点
题目: 给定一棵二叉树和其中的一个节点,如何找出中序遍历顺序的下一个节点?树中的节点除了由两个分别指向左右节点的指针外,还有一个指向父节点的指针。中序遍历:先访问当前节点的左子树,再访问当前节点本身,最后访问当前节点的右子树。 因此: 如果给定节点有右子树,则下一个节点是它的右子节点; 如果给定节点没有右子树,需要向上找到一个祖父节点(它是自己父节点的左节点),该祖父节点的父节点就是下一个节原创 2015-08-02 10:48:01 · 1464 阅读 · 0 评论 -
67 - 机器人的移动范围
题目: 地上有个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7=18.但它不能进入方格(35,38),因为3+5+3+8=19.请问该机器人能够达到多少格子?和上一题66 - 矩阵中的路径类似,只是约束条件发生了改变。原创 2015-08-03 15:19:29 · 1169 阅读 · 0 评论 -
54 - 判断字符串是否是数值
面试题 54 - 表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 例如,字符”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。如: “-23.14e+12”, “600.”,”-.123” 都是数值; “+”,”12e” 不是数值。一个原创 2015-08-01 15:46:18 · 1220 阅读 · 1 评论 -
34 - 丑数
题目描述:http://ac.jobdu.com/problem.php?pid=1214 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解析: 丑数的定义应该为:质因子只含有2、3、5的数 。1 默认是一个丑数。 e.g. 8 = 2*2*2; 18 = 2原创 2015-07-28 22:15:26 · 682 阅读 · 0 评论 -
55 - 字符流中第一个不重复的字符
当从字符流中只读出前两个字符“go”时,第一个只出现一次的字符是‘g’。当从该字符流中读出前六个字符“google”时,第一个只出现 1 次的字符是”l”。首先要记录一个字符出现的次数,为了实现O(1)查找,使用简易hash表存储。用occurences[256] 记录字符出现的次数。设置: occurences[i] = 0, 该字符未出现; occurences[i] = 1, 该字符出现一原创 2015-08-01 16:57:30 · 1004 阅读 · 0 评论 -
52 - 构建乘积数组
题目: 给定一个数组 A[0,1,...,n−1A[0,1,...,n-1],请构建一个数组 B[0,1,...,n−1]B[0,1,...,n-1]。 其中 BB 中的元素 B[i]=A[0]∗ A[1] ∗...∗ A[i−1]∗A[i+1] ∗ ... ∗A[n−1]B[i] = A[0] *\ A[1]\ * ... *\ A[i-1] * A[i+1]\ *\ ...\ * A[n原创 2015-08-01 10:16:52 · 2281 阅读 · 0 评论 -
35 - 找出字符串中第一个只出现一次的字符
在一个字符串中找到第一个只出现一次的字符。 如输入”abaccdeff”,输出’b’解析: 使用一个数组,记录每个字符出现的次数,最后遍历计数数组,第一个个数为 1 的即为结果。 由于字符char,只有8 bit, 只有255种可能,因此只需声明一个255大小的数组。遍历一次字符串,遍历2次计数数组:时间复杂度O(n) 空间占用255*int = 512 Byte,是一个固定大小:空间复杂度原创 2015-07-28 22:46:56 · 1561 阅读 · 0 评论 -
47 - 按位实现加减乘除 四则运算
不使用+-*/四则运算符,实现两个数的四则运算。1. 加用二进制位实现两个数之间的加法。 如 9+15=24 1001 + 1111,由于二进制 0+0=0,1+0=1, 0+1=1, 1+1=0, 可以发现是异或运算,而产生进位,则只有1 ,1相加,即与运算。int add(int nums1, int nums2) { if (nums1 == 0 || nums2 == 0)原创 2015-07-31 16:42:23 · 1296 阅读 · 0 评论 -
56 - 链表中环的入口节点
题目: 一个链表中包含环,如何找出环的入口节点? 例如 1->2->3->4->5->6->(3) ; 的链表中,环的入口及诶到哪是节点 3。解析:首先找到链表中的环:定义2个指针,一个快指针一次走2步,一个慢指针一次走1步,如果2个指针能够相遇,证明有环。统计链表中环的长度:从相遇指针开始,固定 1 个指针,另一个指针从相遇指针走,当2个指针再次相遇时,即走了 1 圈,得到环的长度 l原创 2015-08-01 21:22:55 · 618 阅读 · 0 评论 -
53 - 正则表达式匹配
题目:请实现一个函数用来匹配包含‘.’和‘*’的正则表达式。模式中的字符’.’表示任意一个字符,而‘*’表示它前面的字符可以出现任意次(含0次)。本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串“aaa”与模式“a.a”和“ab*ac*a”匹配,但与“aa.a”及“ab*a”均不匹配。解析: 字符串 str = “aaa”; 模式字符串 pattern = “.b*ac*a” 每次分别原创 2015-08-01 11:48:32 · 806 阅读 · 0 评论 -
59 - 对称的二叉树
判断一棵的。 1 / \ 2 2 / \ / \3 4 4 3递归地 对比左子树的左节点和右子树的右节点 && 对比左子树的右节点和右子树的左节点bool isSysmmeticalCore(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) { if (pRoot1 == NULL && pRoot2 == NULL)原创 2015-08-02 11:04:56 · 551 阅读 · 0 评论 -
66 - 矩阵中的路径
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如在下面的 3*4 的矩阵中包含一条字符串“bcced”的路径。但矩阵中不包含字符串“abcb”的路径,因为字符串的第一个字符 b 占据了矩阵中的第一行第二格子之后,路径不能再次进原创 2015-08-03 11:30:33 · 988 阅读 · 0 评论 -
挑选镇长问题
试题来源:http://www.nowcoder.com/question/next?pid=151724&qid=25196&tid=718946360员工桂最近申请了一个长假,一个人背着包出去自助游了。 路上,他经过了一个小镇,发现小镇的人们都围在一棵树下争吵。桂上前询问情况,得知小镇的人们正缺一个镇长,他们希望能选一个知名又公正的镇长,即,大家希望能选出一个人,所有人都认识他,但同时他不原创 2015-08-13 16:24:36 · 2564 阅读 · 1 评论 -
扑克牌大小,错误统计,给出最高分
扑克牌大小最高分是多少简单错误记录2016华为笔试题:1. 扑克牌大小扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):) 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空原创 2015-09-03 21:51:52 · 1693 阅读 · 0 评论 -
64 - 数据流中的中位数 || STL 堆
题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。思路解析数据是从数据流读出,因此数组的个数是再逐渐的增加。如何选用一个容器,能够存储数据,并能够给出中位数。无序数组:插入O(1) partation操作找出中位数 O(n)有序数组:插入O(n) 找出原创 2015-08-02 17:12:14 · 1831 阅读 · 0 评论 -
按之字形顺序打印二叉树
题目描述:按之字形顺序打印二叉树 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解析: 要分层打印,不能用常规方法,访问一个节点后,将该节点的左右子节点压入队列。 奇数层从左到右打印,偶数层从右向左打印。使用两个栈存储每一层的节点。在访问奇数层时,将奇数层的子节点,按先左后右的顺序将子节点压入偶原创 2015-08-18 16:59:24 · 1083 阅读 · 0 评论 -
费波那也数列的非递归实现
n =0, f(0) = 0;n = 1, f(1) = 1n > 1, f(n) = f(n-1) + f(n-2)使用 2 个临时变量,存储 n-1 和 n-2 的费波那也数; f(2) = f(0) + f(1) ,因此用f(2) 覆盖 f(0) ,因为 f(1) 仍然需要保留;即 f(0) = f(0) + f(1) f(3) = f(1) + f(2) , 因此用f(3) 覆盖原创 2015-08-05 15:44:47 · 1449 阅读 · 0 评论 -
剑指 | 7-利用两个栈构建一个队列
题目描述:http://ac.jobdu.com/problem.php?pid=1512 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解析: 定义2个栈s1, s2 1. 开始时,将元素push进s1 2. front()或pop()时,将s1的数据,出栈,顺序压入s2; 此时发现 s2 的出栈顺序即队列的出队列顺序。 3. 再次push时,仍然原创 2015-07-25 21:35:32 · 918 阅读 · 0 评论 -
8 - 旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。看到排序相关的查找问题,想到二分查找。 举例分析: {1, 2, 3, 4, 5} {5, 1, 2, 3, 4}; {4, 5, 1, 2, 3}; {3, 4原创 2015-08-05 14:49:22 · 659 阅读 · 0 评论 -
46 - 不使用 乘除、循环和判断 语句实现 1+...+n
题目: 求 1 + 2 + … + n. 要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句(A?B:C)要实现 1 + 2 + …+ n 不管是循环实现还是递归实现都必须有终止条件。思路一循环是让相同的代码执行 n 遍。 使用构造函数和静态成员变量实现。构造 n 个类,构造函数会执行 n 次,用静态变量实现 i 递增, sum 求和。#inc原创 2015-07-31 17:06:55 · 749 阅读 · 0 评论 -
树的子结构
面试题 16 - 树的子结构 输入二叉树 A 和 B,判断 B 是不是 A 的子结构。解析: 空树不是树的子结构。 递归求解:如果母树 A 的当前节点等于 B 的根节点,则递归地对 A,B的左右子树分别判断是否满足子结构性质如果母树 A 的当前节点不等于 B 的根节点,则递归分别判断 A 的左右子节点,是否和 B 的根节点相等终止条件是:B 为 NULL,A 非NULL,B 是 A 的原创 2015-08-15 20:30:33 · 663 阅读 · 0 评论 -
65 - 滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 解析: 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,原创 2015-08-03 09:28:00 · 3009 阅读 · 0 评论 -
57 - 删除链表中重复的节点
题目: 在一个排序的链表中,删除重复的节点。 如:1 -> 2 -> 2 -> 2 -> 3 -> 4 -> 4 -> 5; 删除之后:1 -> 2 -> 3 -> 4 -> 5解析: 定义 prev,cur; prev = pHead; 向后找到一个 不等于 prev 的 cur 节点。 prev->next = cur; 链接 prev 和 cur prev , cur 向后移动,原创 2015-08-01 22:10:22 · 972 阅读 · 0 评论 -
12:打印 1 到最大的 n 位数
题目:输入数字 n,按顺序打印出从 1 到 最大的 n 位十进制数。比如输入 3 ,则打印出 1、2 、3 一直到最大的3位数即 999。解析: 容易知道不能用 int 等数字类型表示(大数问题)在字符串上模拟数字加法关键点: 1. 如何用字符串表示n位数? 2. 如何实现字符串数的自增操作? 3. 如何打印一个字符串数? - 申请长度是n+1的字符数组number。 number[原创 2015-07-06 14:33:38 · 756 阅读 · 0 评论 -
45 - 圆圈中最后剩下的数字
题目要求: 0, 1, … , n-1 这 n 个数字排成一个圈,从数字 0 开始每次从这个圈里删除第 m 个数字。求这个圈剩下的最后一个数字。本题是约瑟夫环问题。 除了以下给出的2中解法,更高级的算法:约瑟夫问题的两个O(log n)解法1. 环形链表由于要不断地从圈里删除一个数字,容易想到用链表实现。用链表将这 n 个数字存储,头尾相连,每隔 m 个删除一个,最后剩下的即为结果。 由于原创 2015-07-30 21:50:28 · 711 阅读 · 0 评论 -
44 - 判断扑克牌是否是顺子
题目: 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。首先应该对该问题做数据抽象,5张普通牌可以用数字代替,大小王是特殊牌,我们可以用 0 代替。将大小王和普通牌分离。 检查是否是顺子: 首先应该进行排序,然后统计 0 的个数, 最后统计相邻数字之间的间隔个数。 如果 0 的次数 大于等原创 2015-07-30 16:55:45 · 5865 阅读 · 0 评论 -
28 - 字符串的全排列和组合
字符串的排列题目描述:http://ac.jobdu.com/problem.php?pid=1369 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。分两步: 第一步:求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符都交换一次; 第二步:固定第一个位置原创 2015-07-27 15:48:24 · 1034 阅读 · 0 评论 -
13:在O(1)时间删除单链表节点
题目:给定单项链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。解析: 删除单向链表中的一个节点,常规做法是必须找到待删除节点的前一个节点才能实现,而这样做的时间复杂度是O(n),无法满足要求。 创新想法:当我们想删除一个节点时,并不一定要删除节点本身,可以用当前节点保存它下一节点的值,然后删除它的下一个节点。情况案例: 1. 输入节点为NULL 2. 单链表只有一个节点,即原创 2015-07-06 15:28:41 · 804 阅读 · 0 评论 -
25 - 二叉树中和为某一值的路径
题目描述:http://ac.jobdu.com/problem.php?pid=1368 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解析: 需要找出从根节点到叶节点的路径和等于target,可以想到用深度搜索(前序遍历)方式,当访问某节点时,将该节点添加到路径上,如果该节点是叶节点且恰好等于tar原创 2015-07-27 09:45:18 · 728 阅读 · 0 评论 -
30 - 找出最小的k个数
题目描述:http://ac.jobdu.com/problem.php?pid=1371 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。第一种思路: 如上一题中,用快速排序中的划分函数,划分元素最终下标index小于K,划分[index+1, n];划分元素最终下标index大于K,划分[0, index-1]; 找到原创 2015-07-27 17:22:12 · 802 阅读 · 0 评论 -
11 数值的整数次方 | Power
题目:实现函数double Power(double base, int exponent),求 base 的 exponent 次方。不得使用库函数,同时不需要考虑大数问题。解析: 首先想好测试案例,找出特殊情况 base 可能 正数、负数、0;exponent 可能正数、负数、0 (0,0) :无意义,返回 0 或 1 均可,应询问面试官 (0,-1):负面输入,不能对0取负数 (0,原创 2015-07-05 21:20:37 · 764 阅读 · 0 评论 -
26 - 复杂链表的复制
题目描述:http://ac.jobdu.com/problem.php?pid=1524 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。注:以下解析来自程序员面试题精选100题(49)-复杂链表的复制[算法]精简。第一步,为原始链表的每个节点N创建对应的节点N’,并把N’插入到N的后面第二步,设置复制出来的节点的sibling, N’的转载 2015-07-27 11:50:47 · 418 阅读 · 0 评论 -
22-判断一个序列是否是另一个序列入栈的弹出序列
题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。解析: 注:当无法抽象的解决问题时,应该给出正面和反面的实例来分析问题,发现规律。要判断一个输入序列按照顺序压栈出栈,能否原创 2015-07-17 09:40:52 · 1939 阅读 · 2 评论 -
24 - 判断是否是二叉搜索树的后序遍历序列
剑指offer 24题 题目描述:http://ac.jobdu.com/problem.php?pid=1367 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。搜索二叉树的特征: 左子树的节点小于根右子树的节点大于根任意子树都是搜索二叉树而后序遍历时,左右根,序列的最后一项总是根。在序列中找到根原创 2015-07-26 16:15:29 · 1250 阅读 · 0 评论 -
4-代替字符数组中的空格
题目描述:http://ac.jobdu.com/problem.php?pid=1510 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为”We Are Happy.“则经过替换之后的字符串为“We%20Are%20Happy.”解析: 直观的想法是,新建一个数组,逐个复制,遇到空格时,写入%20,但这需要占用额外空间。 不占用额外空间的算法是原位替换。如果我们顺序的遍原创 2015-07-25 22:01:20 · 735 阅读 · 0 评论 -
5-从尾到头打印链表
题目描述:http://ac.jobdu.com/problem.php?pid=1511 输入一个链表,从尾到头打印链表每个节点的值。 输入: 每个输入文件仅包含一组测试样例。 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。 输出: 对应每个测试案例,以从尾到头的顺序输出链表每原创 2015-07-25 21:45:14 · 572 阅读 · 0 评论 -
51 - 数组中重复的数字
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。解析: 方法一: 如果可以占用额外空间,可以不断的将数组中的数字压入hash-table,逐个的去hash-table中查找,如果找到则说明是有重复的。空间复杂度O(n),时间复杂度O(n)方法二: 但如果不能占用额外空间:原创 2015-07-26 09:44:34 · 711 阅读 · 0 评论 -
29 - 数组中出现次数超过一半的数字
题目描述:http://ac.jobdu.com/problem.php?pid=1370 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。直观想法是,先排序O(nlgn),那么下标是 n/2 的位置上一定是超过数组长度一半的数字。另一种思路是: 用快排里原创 2015-07-27 16:31:39 · 664 阅读 · 0 评论 -
31 - 连续字数组的最大和
题目要求: 输入一个整型数组,有正数也有负数。数组中一个或连续的多个整数组成一个字数组。求所有子数组和的最大值。要求时间复杂度O(n).leetcode | Maximum Subarray 最大连续子序列的和: http://blog.youkuaiyun.com/quzhongxin/article/details/46603957当前和是大于0,则对最大和是有贡献的,保留; 当前和是小于0,则对最大原创 2015-07-27 19:48:52 · 971 阅读 · 0 评论