剑指offer
文章平均质量分 58
Jeff-Li
四海为家,仗剑天涯。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指offer:二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该二进制表示中1的个数,例如把9表示成二进制是1001,有2位1,因此如果输入9,该函数输出2.要求:1、整数,包括边界值1、0x7FFFFFFF2、负数,包括边界值0x80000000、0xFFFFFFFF3、0显然,本体的难点也就是表示负数的情况,因为计算机中是用二进制来表示的,而又是用二进制的补码来表示的,所以当出现负数的情况下,我原创 2014-03-26 00:05:05 · 1490 阅读 · 0 评论 -
剑指offer:最小的k个数
题目:输入n个整数,找出其中最小的k个数。方法1:上面一篇博客我们利用快速排序的partition函数来将数组分成两部分,partition函数的返回值就是排序好的数组的最终下标,其左边是比它小的数,右边是比它大的数,这样我们只需要将partition的返回值与k做比较,如果与k相等,则返回;如果比k大,则最小的k个数在左边,则继续返回递归;如果比k小,则最小的k个数中有一部分在右边,则返原创 2014-04-17 14:53:28 · 878 阅读 · 0 评论 -
剑指offer:把数组排成最小的数
题目:输入一个正整数数组,把数组里的所有数字拼接起来排成一个数,打印能拼接出的所有数字中的最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323package com.interview;import java.util.Scanner;/* * 数组排列中寻找最小排列的数,把数组排列成最小的数 * */public class Array原创 2014-04-17 15:50:49 · 1244 阅读 · 0 评论 -
剑指offer:子数组的最大和
题目:输入一个整形数组,数组里有整数也有负数,数组中一个或者多个整数组成一个子数组,求所有子数组和的最大值。package com.interview;public class FindGreatestSubArray { private boolean valid = true; //这是为了标记输入是否有效的变量 private int greatestSubArray(int原创 2014-04-17 15:23:45 · 845 阅读 · 0 评论 -
剑指offer:从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。private int iFactor = 1, iLower = 0, iCur = 0, iHigh = 0, iCount = 0; public int sum1(int N) { while (N / iFactor != 0) { iLower = N - (N / iFactor) * iFact原创 2014-04-17 15:37:24 · 1046 阅读 · 0 评论 -
剑指offer:求一个旋转数组中的最小值
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素,例如数组{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,该数组的最小值为1。考虑的特殊情况:1、功能测试:输入的数组是升序排序的一个旋转,数组中有重复的数字或者没有重复的数字2、边界值测试:输入的数组是一个升序排序的数组,只包含一个数字的数组3原创 2014-03-25 22:10:59 · 1662 阅读 · 0 评论 -
剑指offer:将字符串转化为整形
我们知道c语言中存在一个函数atoi,就是把字符串转化为整形,现在我们要求不用此函数或者类似的函数写出“字符串转化为整形的函数“。本题要考虑几种特殊的情况1、功能测试:输入的字符串表示正数、负数、02、边界测试:输入最大的正整数,最小的负整数3、特殊输入测试:输入字符串为NULL指针,输入空字符串,输入的字符串有非数字字符。下面是源程序代码:#include#includ原创 2014-03-25 20:00:52 · 1605 阅读 · 0 评论 -
剑指offer:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。要求:1、输入的两个链表中有一个或者多个元素相等。2、输入的链表中有一个或者两个链表都是空链表。基本思路:相信大家都知道这题的思路,本题的考点并在在于思路,而在于对链表基本性质的掌握程序,对链表的创建,构造,重置等性质有了一定的了解,求解本题并不难。对于两个链表,分别有指针指着两个链原创 2014-03-26 19:35:23 · 1035 阅读 · 0 评论 -
剑指offer:打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到n位十进制数,比如输入3,则打印出1、2、3一直到最大的3位数999要求:1、实现大整数的输入,例如输入的数超过了int、long的表示范围,应该采用大整数2、特殊的输入,0、-1C语言中大整数的的运算,使用字符串来实现的,本题的关键在于,从0开始,没有加1,然后输入对应位的最大数,然后继续加1,知道相加的数等于输入的数n为止。原创 2014-03-26 11:22:29 · 1103 阅读 · 0 评论 -
剑指offer:替换空格
题目:请事先一个函数,把字符串中的每个空格替换成“%20”,例如我们输入“I am happy”,输出 "I%20am%happy"。要求:在原字符串上进行替换操作,且时间复杂度为O(n)。基本思路:显然本题如果做成O(N*N)的时间复杂度是十分容易的,而且如果不需要在原字符串上替换也是十分容易的,因为只需要用另外一个字符串盛放自己原字符串就可以了。但是上面两种做法显然是不符合要求原创 2014-03-25 18:30:24 · 1127 阅读 · 0 评论 -
剑指offer:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值。这道题目显而易见,就是使用栈的结构,而递归又是栈的一种体现,所以是使用栈来实现本道题目。下面是源代码:#includetypedef struct ListNode{ int key; struct ListNode *next;}ListNode;ListNode *insertList(Lis原创 2014-04-12 16:45:36 · 883 阅读 · 0 评论 -
剑指offer:从上往下打印二叉树
题目:从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。方法:显然这道题目实际上和图的广度优先遍历要求很相似,实际上树也可以看作一种特殊的图,我们知道图的广度优先遍历是用的队列(图的深度优先遍历用的是堆栈)。具体方法就是:1、先将根节点入队,2、打印根节点,根节点出队,根节点的左右孩子分别入队,左孩子先入,右孩子后入(下同)3、打印左孩子,左孩子出队,则左孩子原创 2014-04-17 09:06:47 · 957 阅读 · 0 评论 -
剑指offer:八皇后问题
相信大家都知道经典的八皇后问题,我们本次不用回溯法求解八皇后问题,我们采用这样的方法,自己定义一个数组,初始数组为{0,1,2,3,4,5,6,7},则数组下标代表行,数组中元素代表列,这样就不会出现两个或者两个以上的数组元素在同一行或者同一列的情况,我们只需要考虑对角巷的情况就可以了,,只要保证两个或者多个元素不在同一对角线上就行了,显然这个对角线分为主对角线和副对角线。下面是运行的程序原创 2014-04-17 12:45:39 · 1299 阅读 · 0 评论 -
剑指offer:数值的整数次方
题目:实现函数double pow(double base,int exp),求base的exp次方,不得使用库函数,同时不需要考虑大数问题。要求:1、考虑base为正数、负数、0的情况,2、考虑exp为正数、负数、0的情况,#includedouble double_pow_positive(double base,int exp);int equal(double原创 2014-03-26 10:24:59 · 1083 阅读 · 0 评论 -
剑指offer:调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求:1、输入一个奇数、偶数相交叉的数组,来检测一下输出2、输入一个数字3、输入空指针常规思路:一般情况下,我们都会想到这样的方法,从头开始检测,如果发现有偶数的,则此偶数后面的数向前移动一位,然后此偶数放在最后一位,这样,光是搜索就要O(n),原创 2014-03-26 16:53:19 · 1094 阅读 · 0 评论 -
剑指offer:链表倒数第k个节点
题目:输入一个链表,输出该链表的倒数第k个节点,假设从1开始计算,链表的尾节点是倒数第一个节点。基本思想:如果只能遍历一次链表就能得到链表的倒数第k个节点就好了,为了实现这个功能,我们定义两个指针。第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历,由于两个指针的距离保持k-1,当第一个指针到达链表尾时,第二个指针正好是倒原创 2014-04-16 21:19:57 · 918 阅读 · 0 评论 -
剑指offer:反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。方法:我们在此处定义3个指针,分别指向当前遍历到的节点、它的前一个节点和后一个节点ListNode* ReverseList(ListNode* pHead){ ListNode* pReversedHead = NULL; ListNode* pNode = pHead;原创 2014-04-16 21:38:19 · 930 阅读 · 0 评论 -
剑指offer:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表的节点仍然是递增排序的。ListNode* Merge(ListNode* pHead1, ListNode* pHead2){ if(pHead1 == NULL) return pHead2; else if(pHead2 == NULL) return pHead1; L原创 2014-04-16 21:53:39 · 784 阅读 · 0 评论 -
剑指offer:判断树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。方法:1、在树A中找到和B的根节点的值一样的节点R;2、判断树A中以R为根节点的子树是不是包含和树B一样的结构。bool HasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2){ bool result = false; if(pRoot1原创 2014-04-16 22:04:11 · 900 阅读 · 0 评论 -
剑指offer:顺时针打印数组
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。这道题目没有太复杂的思想,唯一需要的就是细心,希望大家在做这类问题的时候可以细心一点。现在线上源代码:#includevoid printClockwise(int A[][3],int row_dis,int column_dis,int rows,int columns) //其中row_dis表示打印原创 2014-03-26 21:17:40 · 1343 阅读 · 0 评论 -
剑指offer:二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径,从树的根节点开始往下一直到叶子节点所经过的节点形成的一条路径。方法:用前序遍历方法访问某一节点时,我们把该节点添加到路径上,并累加该节点的值。如果该节点为叶节点并且路径中节点节点值的和刚好等于输入的整数,则当前的路径符合要求,我们打印出来。如果该节点不是叶子节点,则继续访问它的子节点。当节点访问结束时,递归函数自动返原创 2014-04-17 09:00:46 · 922 阅读 · 0 评论 -
剑指offer:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果,假设输入的任意两个数不同。方法:后序遍历的序列中,最后一个数字是树的根节点的值,数组中前面可以分为两部分:一部分是比根节点小的序列,这是树的左子树;一部分是比根节点大的序列,这是树的右子树。然后分别对左子树和右子树做同样的操作。// BST:Binary Search Tree,二叉搜索树bool VerifySquenc原创 2014-04-17 09:02:24 · 804 阅读 · 0 评论 -
剑指offer:求字符的所有组合
题目:输入一串字符,求字符的所有排列,例如输入a、b、c,得到的组合是a bc ab ac bc abc显然ab与ba是相同的。下面的算法是利用回退的性质来求所有的组合的。package com.interview;import java.util.Scanner;/* * 实现组合问题:中心思想,对于abcd,实现插入某一个位置的字符 * a 插入0位置字符原创 2014-04-17 12:40:56 · 1415 阅读 · 0 评论 -
剑指offer:单链表的基本操作
时间久了,怕忘了,就写下来,算是一个回忆吧,这是常见的数据结构:#includetypedef struct ListNode{ int key; struct ListNode *next;}ListNode;ListNode *insertList(ListNode *head,int value); //创建一个单链表和向一个链表中插入元素,这里默认的是头插入原创 2014-04-12 17:06:26 · 1303 阅读 · 0 评论
分享