剑指offer
文章平均质量分 54
qq_2773878606
学生
展开
-
统计0到n之间1的个数
问题描述给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。 例如:N=2时 1,2出现了1个 “1” 。N=12时 1,2,3,4,5,6,7,8,9,10,11,12。出现了5个“1”。1、暴力求解法//暴力求解long CountOnes(long n){ int i,j;//循环变量 int ncount=0;//计数 for原创 2016-07-27 22:26:11 · 781 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分类:数组解法1:经典问题了,每次target跟右上角的元素比较,如果和右上角元素相等,那么返回true如果小于右上角元素,说明在下一行,如果大于右上角元素,说明在左一列就这样不断缩小范围,直到转载 2016-07-20 21:55:29 · 214 阅读 · 0 评论 -
跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分类:数组解法1:本质也是斐波那契数列f(n)=f(n-1)+f(n-2)public class Test3 { public int JumpFloor(int target) { i转载 2016-07-20 21:56:19 · 213 阅读 · 0 评论 -
矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解法1:斐波那契数列 于是f(n) = f(n-1) + f(n-2),于是这又是一个斐波那契数列问题。int rectCover(int number) { if(number<=0) retu转载 2016-07-20 21:58:58 · 226 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。分类:链表,栈解法1:反过来打印。显然,先入栈,再出栈即可。import java.util.ArrayList; import java.util.Stack; public class Solution { public ArrayList printListFromTailToHead(Lis转载 2016-07-20 21:59:54 · 205 阅读 · 0 评论 -
二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。分类:数学解法1:对于某个数n,n与(n-1)取与运算,可以消除最后一个1public class Solution { public int NumberOf1(int n) { int count = 0; while(n!=0){转载 2016-07-20 22:01:25 · 215 阅读 · 0 评论 -
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。分类:队列,栈解法1:入队操作,就是入栈操作,入栈stack1。出队操作,现将stack1的元素逐个取出,放入stack2,这样stack2的栈顶,就是队列的第一个元素了。如果stack2本来就有元素,那么出队就是从栈顶中取,如果没有,根据上述步骤,将stack2的元素加转载 2016-07-20 22:02:53 · 193 阅读 · 0 评论 -
合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。分类:链表解法1:解法的巧妙是建立了一个虚拟的头结点,从而避免了节点交替的问题。建立虚拟头结点的,在链表的很多题目都有见到。/* public class ListNode { int val; ListNode next = null;转载 2016-07-20 22:05:48 · 191 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。分类:链表解法1:使用尾添加的方法就可以了。先建立一个虚拟的头结点,然后遍历链表,将每个节点添加到虚拟节点的next,同时将虚拟节点的所以子节点,添加到当前节点的nextpublic class Solution { public ListNode ReverseList(ListNode head)转载 2016-07-20 22:07:04 · 216 阅读 · 0 评论 -
链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。分类:链表解法1:双指针,第一个指针先走k步,然后第二个指针也开始走,当第一个指针到达末尾,第二个指针也就是到了倒数第k个节点要注意null链表和链表长度不足k的情况/* public class ListNode { int val; ListNode next = nul转载 2016-07-20 22:07:37 · 188 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。分类:数组解法1:类似选择排序,遍历每个元素,对于奇数,向前遍历,使其前面的偶数向后覆盖,直到遇上奇数,结束遍历,最后将奇数放入正确位置public class Solution {转载 2016-07-20 22:08:45 · 215 阅读 · 0 评论 -
求二维数组中最大子数组的和
题目:给出一个 m*n 的二维矩阵(元素可为正可为负),求该二维矩阵的一个子矩阵,且此子矩阵中所有元素的和最大,并输出该矩阵的和。分析:因为输出的是矩阵,把每列数据中第i行到第j行进行相加,这样得到一个列矩阵,a[1......n],这样就转化成一个一维整数数组中最大子数组的和,通过求得循环不同第i行到第j行之间的值之和,最后找到最大值。#include #include原创 2016-07-29 16:41:48 · 2884 阅读 · 0 评论 -
判断一个数组是否是另一个数组的子集
给两个数组:arr1[0..m-1] 和arr2[0..n-1]. 判断arr2是否是arr1的一个子集合,两个数组都是未排序的。例子:Input: arr1[] = {11, 1, 13, 21, 3, 7}, arr2[] = {11, 3, 7, 1}Output: arr2[] is a subset of arr1[]Input: arr1[] = {1, 2原创 2016-07-28 11:01:29 · 6666 阅读 · 0 评论 -
数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。分类:数组解法1:使用map来记录重复数字即可,由于数字的大小在0-n-1之内,可以使用数组来代替ma转载 2016-07-28 10:26:19 · 284 阅读 · 0 评论 -
不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。分类:数学解法1:考虑位运算,分三步:第一步:不进位加 n1第二步:计算进位 n2第三步:n1 和 n2求和(重复第一步,直到进位为0,即n2=0)在第一步中,采用异或第二步中,采用按位与,左移一位public class Solution { publ原创 2016-07-28 10:12:50 · 301 阅读 · 0 评论 -
变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分类:数组解法1:关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:f(1) = 1f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。原创 2016-07-28 10:13:51 · 260 阅读 · 0 评论 -
旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。分类:数组,二分法解法1:对于旋转数组,使用二分法来查找最小元素。取中间mid元素,如果array[mid]>array[end],说明最小元素应该在mid的右边,因为我们实转载 2016-07-28 10:14:50 · 279 阅读 · 0 评论 -
字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。import java.util.ArrayList;public class Solutio转载 2016-07-28 10:18:03 · 362 阅读 · 0 评论 -
求有环单链表的环连接点位置
第一次碰撞点Pos到连接点Join的距离=头指针到连接点Join的距离,因此,分别从第一次碰撞点Pos、头指针head开始走,相遇的那个点就是连接点。在环上相遇后,记录第一次相遇点为Pos,连接点为Join,假设头结点到连接点的长度为LenA,连接点到第一次相遇点的长度为x,环长为R。 第一次相遇时,slow走的长度 S = LenA + x; 第一次相遇时原创 2016-07-19 21:58:42 · 645 阅读 · 0 评论 -
求有环单链表的链表长
#include #include typedef struct node{ int value; struct node *next;}LinkNode,*Linklist;/// 创建链表(链表长度,环节点起始位置)Linklist createList(){ Linklist head = NULL; LinkNode *preNode = hea原创 2016-07-19 21:59:18 · 242 阅读 · 0 评论 -
求有环单链表的环长
在环上相遇后,记录第一次相遇点为Pos,之后指针slow继续每次走1步,fast每次走2步。在下次相遇的时候fast比slow正好又多走了一圈,也就是多走的距离等于环长。设从第一次相遇到第二次相遇,设slow走了len步,则fast走了2*len步,相遇时多走了一圈: 环长=2*len-len。int getRingLength(LinkNode *meetNode){原创 2016-07-19 21:54:42 · 278 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。分类:链表,栈解法1:反过来打印。显然,先入栈,再出栈即可。/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this原创 2016-07-19 21:50:31 · 253 阅读 · 0 评论 -
删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.va转载 2016-07-28 10:19:45 · 312 阅读 · 0 评论