剑指offer
aogogogo
这个作者很懒,什么都没留下…
展开
-
数组 +字符串
记录自己在剑指offer刷题经验,坚持每天做几题理理思路学学算法的思想,其实啥都不会,看刷一遍能不能开拓一下先1)二维数组中查找目标值思路是:从二维数组的右上角或者左下角开始寻找,比如右上角开始,若值比target大;则这一列的值都将大于target所以cols-1;若值比target小则rows+1向下一行继续收索;代码如下考点:1)数组的行列值 int col=arra...原创 2018-04-08 18:25:27 · 198 阅读 · 0 评论 -
求出任意非负整数区间中1出现的次数
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路:直接把所有1~N的数字用StringBuffer存储再用append拼接起来...原创 2018-07-31 15:24:02 · 621 阅读 · 0 评论 -
打印能拼接出的所有数字中最小的一个
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:首先将数组所有的数放到list集合中,用collections.sort(list,new Comparator<>(){})重写一个compare方法,将两个整数以拼接的形式表达并比较大小,按这个方法...原创 2018-08-01 14:15:40 · 651 阅读 · 0 评论 -
找出数组中有一个数字出现的次数超过数组长度的一半返回这个数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:若超过一半,按顺序排列数组的中间值肯定就是这个数,将arr[length/2]这个数字提出来做比较,计算出现的次数count与length/2的大小,若大则返回这个数字,否则返回0...原创 2018-08-03 12:50:29 · 3279 阅读 · 4 评论 -
下一个排列
既然你诚心诚意的发问了,我就死乞白赖的写一下吧,写(捡)一个是一个,这条鱼在乎。实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,...原创 2018-09-04 21:06:59 · 141 阅读 · 1 评论 -
输入字符串返回其中出现次数最多的字母的大写形式
题目: eg: 输入:12*%236addarbW EE FSFXAaA (无所谓数字字母特殊符号空格); 输出:A5 思路:先把输入字符串全转换成大写形式,再定义一个26位的数组,判断当前值,若是字母就将它存放到与A的差值数对应的数组序号里(先把数组号取出,将其次数加一,再放回去)。即数组序号代表A-Z的序号,数组的值对应字母出现的次数。最后遍历,取出最大值。值得注意的是...原创 2018-10-03 17:52:47 · 1044 阅读 · 0 评论 -
荷兰国旗问题
问题:输入RGB三种字母的随机排列的字符串,要求输出R在左边G在中间B在右边的情况。eg 输入 :RBGRBGGRBGGRGBRGGRG 输出:RRRRRRGGGGGGGGGBBBB思路:定义两个指针变量,分别划分最左端R和最右端B,对当前数组循环遍历,如若为R则与R区间的下一个指针交换,若为B则与B区间的前一个指针位置交换,注意:前者需要 i++ ; 后者 i 不变 ...原创 2018-10-03 20:14:27 · 341 阅读 · 0 评论 -
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
定义:父树包含子树的所有节点,注意,空树不是任何数的子树。思路:用递归来实现,从A树的根节点开始,判断其所有的节点是不是依次和树B相同,如不同,递归调用函数,继续判断树A当前节点的左子树的所有节点或右子树的所有节点是否和树B所有节点相同,直到遍历到父树A的叶子节点,如果不是完全相同,则树B不是树A子树,如果直到遍历到树B的叶子节点,其所有节点在树A中均有,则树B是树A的子树。isSubt...原创 2018-10-03 22:22:13 · 3443 阅读 · 2 评论 -
输入一个链表,输出该链表中倒数第k个结点。
两种思路:1)用栈的思想,先把链表反转,然后再找出第k个节点。先把所有节点放进栈内,同时统计节点个数,若总节点数小于k则返回null。在弹出栈,倒数k即为弹出的第k个值。2)定义两个指针,一个指针先走k步,再两者一起往后走,当第一个指针到达终点的时候,第二个指针刚好到达倒数第k点,因为他们之间的距离恒为k。 import java.util.List;import java...原创 2018-10-06 14:02:02 · 343 阅读 · 0 评论 -
连续子向量的最大和
给一个数组,返回它的最大连续子序列的和.例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。思路一:暴力解法,i循环遍历数组,j作为它的累积求和的变量循环剩下的数组。将所有结果放到list集合中,排序,选出最大的返回出来。import java.util.List;import java.util.Collections;imp...原创 2018-07-31 09:39:59 · 1426 阅读 · 0 评论 -
矩阵顺时针打印
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.思路:定义四个变量,分别代表矩阵的左上角和右下角,top、bottom、left、right。顺时针打印就是从 left到ri...原创 2018-07-30 15:48:33 · 172 阅读 · 0 评论 -
从尾到头打印链表+反转链表
3从尾到头打印链表思想1):直接堆栈先进后出,调换顺序考点: 新建栈 Stack<Integer> stk=new Stack<Integer>(); 进栈: s...原创 2018-04-12 15:44:03 · 387 阅读 · 0 评论 -
旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:数组可分为两个子序列,要么中间数大于数组第一个数,则最小值在中间数到尾之间; 否则,...原创 2018-05-01 15:41:44 · 100 阅读 · 0 评论 -
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:这种二叉树的问题最好画图来解决,比较直观。先画出它的图像先先序遍历:遍历顺序规则为【根左右】中序遍历:遍历顺序规则为【左根右】后序遍历:遍历顺序规则为【左右根...原创 2018-04-21 14:03:34 · 108 阅读 · 0 评论 -
用两个栈来实现一个队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路: 栈的特性是:后进先出,而队列的特性是:先进先出。这里使用两个栈实现队列有点负负得正的意思。 栈1负责添加,而栈2负责删除。【操作两个“先进后出”的栈实现一个“先进先出”的队列CQueue】---a先进,a先出用两个栈模拟队列操作:1)stack1负责入栈,元素{a,b,c}以顺序入栈2)s...原创 2018-04-21 16:47:27 · 801 阅读 · 0 评论 -
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
两种方法。第一种,是用位运算,将1每次左移,和数字进行&运算,如果成功,则返回1. 第二种,将整数通过方法转换为二进制数,然后统计其中1的数量 public class Solution { public int NumberOf1(int n) { int number = 0; String string = Integer.toBinar...原创 2018-06-22 21:30:48 · 183 阅读 · 0 评论 -
求base的exponent次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。这道题要考虑的指数正和反的区别,另外注意,result的初始值是1.0,要设置为double类型;public class Solution { public double Power(double base, int exponent) { double res...原创 2018-07-09 22:15:02 · 466 阅读 · 0 评论 -
调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,保证相对位置不变。
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 i 定义数组长度的循环变量, j 定义剩余数组的比较次数。若连续的【 j 】和【 j+1 】分别是偶数和奇数的话,就交换两者位置。最后奇在前,偶在后。如:原数组为{2,6,7,1,4,5}i = 0; j...原创 2018-07-10 11:53:23 · 710 阅读 · 0 评论 -
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
考虑递归,listnode的两个方法,list.val和list.next.用图解释:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution {...原创 2018-07-28 15:04:16 · 172 阅读 · 0 评论 -
在一个字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1
思路:用list集合来保存,循环遍历输入字符串,若list中包含该值就删除,否则就加入集合中。即:集合中最终保存的是只出现过一次的字符。package offer;import java.util.ArrayList;public class firstNotRepeatingChar { public static int FirstNotRepeatingChar(...原创 2018-10-06 15:59:14 · 3010 阅读 · 3 评论