
剑指Offer
肥龙宝宝
闲来无事写写文章,学做文化人儿
展开
-
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串(剑指offer)
解题思路:求解整个字符串的排列步骤:1、求得所有可能出现在第一个位置上的字符,将第一个位子上的字符与后面的交换2、固定第一个字符,求后面字符的排列,就涉及递归的问题了class Solution {public: vector Permutation(string str) { vector result; //创建字符串数组 int原创 2017-02-24 21:04:52 · 13044 阅读 · 0 评论 -
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向思路总结:本题是结合二叉搜索树与双向链表的考点本质上是分为三个部分,左、右子树 和根节点 进行考虑,即将左子树转换成链表后,将尾节点与根节点连接,再将根节点带入递归表达式求右子树节点,最终实现转换,注意将尾节点移回到头部的节点。/*struct TreeNode { int va原创 2017-02-24 17:23:06 · 1463 阅读 · 0 评论 -
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径(剑指offer)
解题思路:遍历二叉树,采用递归的方法,将满足条件的路径压入一维数组当中,注意当找到满足条件的路径时,先将数组压入二维数组,然后将一维数组中的每个元数弹出,以存放新的路径。/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left原创 2017-02-23 11:32:46 · 3561 阅读 · 0 评论 -
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解题思路:1、最简单方法,先排序,再取前k个,时间复杂度O(NlogN)class Solution {public: vector GetLeastNumbers_Solution(vector input, int k) { vector result; int len = input.size(); if(len !=0&&!原创 2017-02-24 22:03:34 · 1664 阅读 · 0 评论 -
求某个数在数组中出现的次数超过数组的一半
解题思路:1、某个数值在数组中出现的次数超过数组的一半,言下之意就是,该数比剩下所有的数的个数和都要来的大,因此借助两个变量,一个result 来存放结果,一个用来计result的数,遍历数组,遇到与result相等的数时,计数值+1,遇到与之不同的数时计数值-1,当计数值为0时,获取新的result,直到最后,一个使得计数值为1的数就是结果。class Solution {public原创 2017-02-24 21:37:52 · 435 阅读 · 0 评论 -
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
解题思路:/*struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { }};*/class S原创 2017-02-25 11:14:01 · 1605 阅读 · 0 评论 -
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。剑指Offer(32)
解题思路: 先两两比较,例如m、n,确定哪个应该排在前面,哪个应该排在后面,比较的规则就是mn与nm哪个更小,利用排序函数将小的数放在字符串数组的前面,最后拼接字符串以输出。(注意大数的问题,因此将数值装换为字符串)class Solution {public: static bool compare(const string& s1, const string& s2)原创 2017-02-26 20:47:00 · 2212 阅读 · 0 评论