剑指offer
yanner_
这个作者很懒,什么都没留下…
展开
-
斐波那契数列
描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。分析:这个题可以说是迭代(Iteration) VS 递归(Recursion), f(n) = f(n-1) + f(n-2),第一眼看就是递归啊,简直完美的递归环境,递归肯定很爽,这样想着关键代码两三行就搞定了,然而并没有什么用,测试用例里肯定准备着一个超大的n来让Stack Overflow。因此用递归...原创 2018-06-21 17:51:33 · 117 阅读 · 0 评论 -
反转链表——链表
题目描述 输入一个链表,反转链表后,输出新链表的表头。思路分析:function ReverseList(pHead){ if(pHead == null) { return false; } var p1 = pHead; var p2 = null, temp = null; while(p1) { tem...原创 2018-08-02 22:07:38 · 150 阅读 · 0 评论 -
链表中倒数第k个结点——链表
题目描述: 输入一个链表,输出该链表中倒数第k个结点。思路分析:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指针走(k-1)步,到达第k个节点。让两个指针相差k个位置,然后两个指针同时往后移动,当第一个指针到达末尾的时候,第二个指针所在位置就是倒数第k个节点了。function FindKthToTail(head, k){ if(!head || k &l...原创 2018-08-02 21:38:15 · 123 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面——数组、排序
问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路分析:新创建2个数组,分别存放奇数和偶数,最后再拼接即可。function reOrderArray(array){ var arr1=[]; var arr2=[]; for(va...原创 2018-08-02 20:39:38 · 138 阅读 · 0 评论 -
数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路1/** * 1.全面考察指数的正负、底数是否为零等情况。 * 2.写出指数的二进制表达,例如13表达为二进制1101。 * 3.举例:10^1101 = 10^0001*10^0100*10^1000。 * 4.通过&1和>>1来逐位读...原创 2018-08-01 21:54:07 · 147 阅读 · 0 评论 -
二进制中1的个数——位运算
题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路1: 陷入死循环的错误思路:最初想法是从这个整数二进制的最右边判断是不是1,用1和n进行位与运算,结果要是为1则n的2进制形式,最右边那位肯定是1,否则为0。然后再把n的二进制形式往右移一位进行判断。该解法如果输入时负数会陷入死循环,因为负数右移时,在最高位补得是1,本题最终目的是求1的个数,那么会有无数个1了。...原创 2018-08-01 21:27:27 · 202 阅读 · 0 评论 -
递归(迭代)——矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?题目分析 依旧是斐波那契数列,2*n的大矩形,和n个2*1的小矩形,其中target*2为大矩阵的大小。有以下几种情形:1.target <= 0 大矩形为<= 2*0,直接return 1; 2.target = 1大矩形为2*1,只...原创 2018-07-31 22:02:16 · 317 阅读 · 0 评论 -
顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路分析: 1.选坐标为(0,0),(1,1)…的点记为(start,start),作为开始坐标,下一圈开始坐标为(sta...原创 2018-08-04 20:09:38 · 101 阅读 · 0 评论 -
递归(迭代)——变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题目解析 根据上一个题目:青蛙只跳1或2可以得出是一个斐波那契问题,即a[n]=a[n-1]+a[n-2],那么能跳1,2,3个台阶时a[n]=a[n-1]+a[n-2]+a[n-3],……关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:f(1) = ...原创 2018-07-30 21:56:54 · 143 阅读 · 0 评论 -
递归(迭代)——跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。题目解析 对于第n个台阶来说,只能从n-1或者n-2的台阶跳上来,所以 F(n) = F(n-1) + F(n-2) 所以当前台阶的跳法总数=当前台阶后退一阶的台阶的跳法总数+当前台阶后退二阶的台阶的跳法总数 显然是一个斐波那契数列,只要找到初始条件就好了。...原创 2018-07-30 21:26:32 · 363 阅读 · 0 评论 -
旋转数组的最小数字-二分查找
描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析: 旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素。 注意到实...原创 2018-06-22 11:26:40 · 151 阅读 · 0 评论 -
合并两个排序的链表——链表、递归
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路分析 用递归思想,依次将两个链表的每个元素递归对比后实现,注意此题考查代码的鲁棒性,故判断条件不能少!/*function ListNode(x){ this.val = x; this.next = null;}*/function Merge(pHead1,...原创 2018-08-02 22:29:06 · 202 阅读 · 0 评论