随笔分类 - 剑指offer
摘要:请从字符串中找出一个最长的不包含重复字符的连续子字符串,计算该最长连续子字符串长度。假设字符串只包含'a'~'z'的字符。例如在字符串"arabcacfr"中,最长连续子字符串为"acfr",长度为4。 解题思路 这是一道基础的动态规划题,首先应该能想到用暴力法解决,然后再考虑是否能用动态规划来优化
阅读全文
摘要:在一个m x n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格,直到到达棋盘的右下角。请问你最多能拿到多少价值的礼物? 解题思路 这是一道基础的动态规划题,首先应该能想到用回溯法求解,然后再考虑是否能用动态规划来
阅读全文
摘要:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 解题思路 有4种情况: 该节点有右子树 该节点没有右子树,且是根节点 如果该节点没有右子树,且是左子节点 该节点没有右子树,且是右子节点 上代码(C++香) str
阅读全文
摘要:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成“a”,1翻译成“b”,……,25翻译成“z”。一个数字可能有多种翻译。例如,12258有5种不同的翻译,分别是“bccfi”、“bwfi”、“bczi”、“mcfi”、“mzi”。求一个数字有多少种不同的翻译方法? 解题思路 回溯法(暴力枚举
阅读全文
摘要:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 解题思路 简单判断 字符串中包含字符、数字、空格。首先应该去掉前导、后导空格。 上代码(C++香) int StrToInt(string str) { int length = str.
阅读全文
摘要:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 解题思路 回溯法(较暴力) 重新定义比较数字函数**(较高级)** 上代码(C++香) 法一,回溯法递归出全排列 #inc
阅读全文
摘要:求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现
阅读全文
摘要:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2}
阅读全文
摘要:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。 下次一定记住不要
阅读全文
摘要:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 解题思路 排序后遍历(相当于简化后的暴力)O(logn) 借助快排的Partition思想O(n) 上代码(C++香) 法一:排序后遍历(相当于简化后的暴力) class Sol
阅读全文
摘要:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 解题思路 排序后遍历(相当于简化后的暴力)O(logn) 根据数组特点,相当于寻找数组的
阅读全文
摘要:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 解题思路 回溯法,easy 只不过要注意判断字符可能出现连续的重复,则需要判断 上代码(C++香) #include <io
阅读全文
摘要:输入一棵二叉树,将其序列化为char*,并且支持反序列化为二叉树。 解题思路 先序遍历二叉树,序列化 同先序遍历结构,反序列化 代码运行结果没问题,但是未通过所有测试案例。。。 #include <iostream> #include <algorithm> #include <math.h> #i
阅读全文
摘要:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 解题思路 中序遍历,分治(较难懂) 加入辅助栈存储中序遍历结果,然后修改指针(较简单) 法一:中序遍历+分治 #include <iostream> #include <algorithm> #include <math.h> #incl
阅读全文
摘要:请实现函数RandomList* Clone(RandomList* pHead),复制一个复杂链表。在复杂链表中,每个节点除了有一个next指针,还有一个指向任意一个节点的random指针。 解题思路 这个题目可以分两步来完成: 遍历节点的next指针,先复制出所有的节点 遍历所有节点的rando
阅读全文
摘要:反转单链表的两种方法 今天看了帅地的第二版资料,突然发现单链表的反转居然还可以用递归来做,太妙了吧! 直接上代码,目前只有C++版的(用指针写链表它不香吗?): // 递归法反转单链表 ListNode* reverseListPlus(ListNode* pHead){ if(pHead == n
阅读全文
摘要:考察二叉树的前序遍历。 C++版本 #include <iostream> #include <vector> #include <stack> #include <cstring> #include <string> #include <queue> #include <algorithm> #i
阅读全文
摘要:二叉搜索树的后序遍历序列。这个题目应该注意二叉搜索树的后序遍历的特征:最后一个值是根节点。 C++版本 #include <iostream> #include <vector> #include <stack> #include <cstring> #include <string> #inclu
阅读全文
摘要:之字形打印二叉树。并非广度优先搜索,需要使用两个辅助栈。 C++版本 #include <iostream> #include <vector> #include <stack> #include <cstring> #include <queue> #include <algorithm> #in
阅读全文
摘要:数组问题。输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。并且保证奇数与奇数、偶数与偶数之间的相对位置不变。 C++版本 #include <iostream> #include <vector> #include <stack>
阅读全文