剑指offer
文章平均质量分 73
行者小朱
stay hungry,stay foolish
展开
-
字符串的全排列
题意描述:写一个函数求字符串的全排列,如 abc 的全排列 : abc, acb, bca, dac, cab, cba解题思路:以123为例,123的全排列有123、132、213、231、312、321这六种。先考虑213和321的来源,显然这两个数都是分别与第一位交换得来的,然后再根据123、213和321得到132、231、312。因此可以知道——全排列就是从第一个数字起每个数分别与它原创 2016-04-06 09:14:33 · 422 阅读 · 0 评论 -
数值的整数次方
题意描述:实现函数double Power(double base, int exp),求base的exp次方,不得使用库函数,同时不用考虑大数问题解题思路:这样的题目通常情况下会直接写出如下代码double Power(double base, int exponent) { double result = 1; for (int i = 0; i < exponent; ++i)原创 2016-05-23 11:10:27 · 528 阅读 · 0 评论 -
替换字符串中的空格(C++/Java实现)
题意描述:题意描述:实现一个函数把字符串中的每个空格替换成“20%”。例如:输入:“we are happy”输出:“we%20are%20happy”解题思路:(C++实现方法)如果从前往后遍历,遇到空格再将字符向后移动,则假设有O(n)个空格的时间效率就是O(n^2)。因此优化的解法就是一次移到位,先遍历一次字符串,可同时得到字符串的长度和字符串中空格的数量,然后对于1个空格用原创 2016-05-09 09:18:08 · 2183 阅读 · 0 评论 -
二叉树中和为某一值的路
题意描述:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。如: 10 / \ 5 12 / \ 4 7解题思路:借助栈,进行深度优先遍历,如果当前结点为叶子结点并且从根结点到当前结点的值的和等于给定值,则找到一条路径并打印原创 2016-06-18 19:19:10 · 488 阅读 · 0 评论 -
LeetCode---UglyNumberII解题分析
题意描述:UglyNumber的定义为一个数分解后只包含2、3、5因子,比如6、8是UglyNumber而14不为UglyNumber,1是典型的UglyNumber。求第N个UglyNumber解题思路一:逐个判断每个数字是否为UglyNumber至第N个UglyNumber为止,而判断每个数字是否为UglyNumber就是根据定义依次除去因子5、3、2,当不能再被5、3、2整除时是1就是U原创 2016-05-05 14:37:51 · 590 阅读 · 0 评论 -
约瑟夫环的问题---最后剩下哪一个
题意描述:0,1,……,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里面删除第m个数字。求这个圆圈中最后剩下的一个数字解题思路一:模拟一个环,然后每次删除第m个数字解题思路二:上述思路可行,但明显时间复杂度O(mn)。因此还是希望找找删除数字有什么规律。 递归公式: 0 , n = 1原创 2016-08-16 10:10:04 · 2682 阅读 · 0 评论 -
判断给定的数组是否为二叉搜索树的后序遍历序列
题意描述:输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。例如输入{5,7,6,9,11,10,8}返回true;输入{7,4,6,5}返回false对应的后序遍历结果为5、7、6、9、11、10、8解题思路:在后序遍历序列中,最后一个数字是树的根结点的值,前面的数字可分为两个部分:第一部分...原创 2016-06-17 09:50:44 · 756 阅读 · 1 评论 -
求TopK问题
题意描述:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4解题思路一:先将n个整数排序,然后输出k个最小的数字即可vector findKMinNum(vector num, int k) { sort(num.begin(), num.end()); vector res; for (int i = 0;原创 2016-07-07 21:38:58 · 469 阅读 · 0 评论 -
把数组排成最小的数
题意描述:输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个如:输入数组{3,32,321},则打印出这三个数字能排成最小的数字为321323解题思路:根据题意要求,两数字m和n能拼接成数字mn和nm。如果mn#include#include#include#includeusing namespace std;bool原创 2016-04-01 10:13:57 · 420 阅读 · 0 评论 -
判断一个链表是否是回文链表
题目描述:判断一个链表是否是回文链表(如何能达到时间复杂度为O(n)的同时空间复杂度为O(1))解题思路:最初的思路是遍历链表,取出其中的结点值拼成字符串,然后判断字符串是否是回文字符串,如下:boolean isPalindrome(ListNode head) { ListNode p = head; String str = ""; while(p != null){ st原创 2016-05-26 08:41:39 · 10194 阅读 · 8 评论 -
调整数组顺序使奇数位于偶数前面及运用解耦方法解决扩展问题
问题描述:输入一个数组,实现一个函数将数组中数字重新排序,使得所有奇数位于数组的前面,所有偶数位于数组的后面解题思路:借鉴快排的思想,使用两个指针,指针1指向数组第一个元素(从前向后遍历),指针2指向数组最后一个元素(从后向前遍历),当指针1指向元素为偶且指针2指向元素为奇时交换两元素,当两指针相遇时遍历结束void ReorderOddEven(int* pData, int len原创 2016-05-25 10:11:30 · 463 阅读 · 0 评论 -
二维数组中的查找
题意描述:在一个二维数组中,每一行都按从左到右的递增顺序排序,每一列也按照从上到下的递增顺序排序完成函数,输入一个这样的一个二维数组和一个整数,判断是否含有该整数例如:1 2 892 4 9124 7 10136 8 1115如果查找7返回true,如果查找5返回false解题思路:依次从右上遍历,如果当前值等于给定值,返回tru原创 2016-06-03 08:54:55 · 288 阅读 · 0 评论 -
软件版本字符串排序
题意描述:软件的版本号一般是由数字和“.”组成的字符串,现比较两个字符串version1和version2,如果version1>version2返回1,如果version解题思路:字符串由数字和"."组成,所以先将字符串通过split()转化为字符数组,再逐位比较如果index=i区别出来了直接返回,否则比较index=i+1位int compareVersion(String vers原创 2016-06-04 15:18:47 · 2250 阅读 · 0 评论 -
复杂链表的复制(随机指针)
题意描述:请实现函数ComplexListNode *Clone(ComplexListNode* head),复制一个复杂链表。在复杂链表中,每个结点除了有一个pNext指针指向一下一个结点外,还有一个pOther指向链表中任意结点或NULL。结点的定义如下:struct ComplexListNode { int val; ComplexListNode* pNext; Co...原创 2016-06-29 22:18:39 · 482 阅读 · 0 评论 -
将二叉搜索树转换成双向链表
题意描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。如下图所示:二叉树的定义如下:struct BinaryTreeNode { int val; BinaryTreeNode* pLeft; BinaryTreeNode* pRight;};解题思路:二叉搜索树的中序遍历是有序的,而对于树的遍历一般都原创 2016-06-30 20:19:45 · 335 阅读 · 0 评论 -
二叉树的镜像
题意描述:输入一个二叉树,写函数实现输出该二叉树的镜像。二叉树的定义如下:struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};即将下图的左边的树转换成右边的树:解题思路:先想只有三个结点的树,做法是交换左右子结点,即求得这样三个结点的树的镜像。同...原创 2016-06-30 20:43:07 · 312 阅读 · 0 评论 -
Number of 1 Bits(二进制中1的个数)
题意描述:写一个函数计算无符号整数二进制形式中1的个数。如“11”(二进制形式“00000000000000000000000000001011”)返回3;解题思路一:Java中没有unsigned int,这里采用通过移位来实现计数1的个数int hammingWeight(int n) { int count = 0; while(n != 0){//因为Java中没有无符号的整数原创 2016-06-04 14:58:41 · 1010 阅读 · 1 评论 -
打印1到最大的N位数
题意描述:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1、2、3……999解题思路一:先找到最大的那个数字,然后再从1开始循环打印void Print1ToMaxOfNDigits(int n) { int num = 1; int i = 0; while (i < n) { num *= 10; ++i; } for (int i = 0;原创 2016-06-30 21:01:17 · 699 阅读 · 0 评论 -
在O(1)时间内删除链表结点&&删除链表中重复节点
题意描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点解题思路:要求在O(1)时间内删除结点,则可以这样考虑:将给定结点后继结点的值赋给给定结点,然后删除给定结点的后继结点即可void DeleteNode(ListNode** pHead, ListNode* pToBeDeleted) { if (!pHead || !pToBeDeleted) r...原创 2016-06-30 21:05:43 · 971 阅读 · 0 评论 -
树的子结构
题意描述:输入两棵二叉树A和B,判断B是不是A的子结构。如下判断右边的树是否为左边树的子结构二叉树的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};解题思路:依次判断B的根结点是否与A的某一结点相同,如果是则进一步判断B的子结点...原创 2016-06-30 21:19:10 · 442 阅读 · 0 评论 -
栈的压入和弹出序列
题意描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。如:输入顺序:1,2,3,4,5则4,5,3,2,1是其输出顺序 但4,3,5,1,2不是其输出顺序解题思路:(1)如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;(2)如果一下个弹出的数字不在栈顶,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶;(原创 2016-06-12 21:54:11 · 2449 阅读 · 0 评论 -
找到栈最小元素
题意描述:定义栈的数据结构,请在该类型中实现一个能够找到栈最小元素的min函数。在该栈调用min、push、pop的时间复杂度都是O(1)解题思路:引用数据栈和辅助栈解题,入栈:数据栈中直接压入元素,当辅助栈空或者要压入的元素小于当前辅助栈栈顶元素时,辅助栈也压入该元素出栈:在数据栈不空的前提下,如果辅助栈栈顶元素与数据栈栈顶元素相等,则都弹出;否则只弹出数据栈栈顶元素得最小元素:原创 2016-06-06 15:54:19 · 2081 阅读 · 2 评论 -
顺时针打印矩阵
题意描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如输入以下:1 2 3 4 5 6 7 89 10 11 1213 14 15 16输出:1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10解题思路一:《剑指offer》上给出的解法是第一步打印上(1--4),第二步打印右(8--16),原创 2016-06-03 17:05:39 · 337 阅读 · 0 评论