![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
-玫瑰少年-
别管,拼!
展开
-
圆圈中最后剩下的数字(约瑟夫环问题)
0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3示例 2:输入: n = 10, m = 17输出: 2模拟链表,O(n^2))如果单纯用链表模拟的话,时间复杂度是 O(nm)O(nm) 的,可以看下题目的数据范围,肯定是不能转载 2020-10-08 17:32:03 · 409 阅读 · 0 评论 -
序列化二叉树
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。方法一:BFSpublic class Codec { //把树转化为字符串(使用BFS遍历) public String serialize(TreeNode root) { //边界判断,如果为空就返回一个字符串"#" if (root == null) return "#";原创 2020-10-08 11:47:22 · 219 阅读 · 1 评论 -
数组中数字出现的次数 II
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例 1:输入:nums = [3,4,3,3]输出:4示例 2:输入:nums = [9,1,7,9,7,9,7]输出:1以下解题思路来自剑指Offer,侵删。解题思路:如果数组中的数字除一个只出现一次之外,其他数字都出现了两次。我们可以如Solution56_1一样用异或位运算(^)解决这个问题。上述思路不能解决这里的问题,因为三个相同的数字的异或结果还是该数字。尽管我们这里不能应用异转载 2020-10-08 09:41:35 · 304 阅读 · 0 评论 -
把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: “102”示例 2:输入: [3,30,34,5,9]输出: “3033459”通过在排序时传入一个自定义的 Comparator 实现,重新定义 String 列表内的排序方法,若拼接 s1 + s2 > s2 + s1,那么显然应该把 s2 在拼接时放在前面,以此类推,将整个 String 列表排序后再拼接起来。class Solution {原创 2020-10-07 10:26:43 · 131 阅读 · 0 评论 -
丑数
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。解题思路很多题解都讲解了动态规划的基本思路, 但是, 对于为什么要设置 3 个指针 p2, p3, p5 并且进行相应的 +1 操作, 并没有讲的很清楚。丑数的定义我们把只包含因子 2、3 和 5 的数称作丑数.根据题意, 一个丑数必然可以写为 A0转载 2020-10-05 16:31:32 · 99 阅读 · 0 评论 -
n整数中1出现的次数 / 数字 1 的个数
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。示例 1:输入:n = 12输出:5示例 2:输入:n = 13输出:6解题思路f(n))函数的意思是1~n这n个整数的十进制表示中1出现的次数,将n拆分为两部分,最高一位的数字high和其他位的数字last,分别判断情况后将结果相加,看例子更加简单。例子如n=1234,high=1, pow=1000, last=234可以将数原创 2020-10-05 12:13:46 · 511 阅读 · 0 评论 -
数字序列中某一位的数字
找规律:0 占第0位1~9 共9x1 = 9个数字 占位9x1 = 9 位10~99 共9x10 = 90个数字 占位90x2 = 180 位100~999 共9x100 = 900个数字 占位900x3 = 2700 位…规律是不是很好理解啦,算法的逻辑就是:我们依次算一下占位数字,并不断地累加得到当前的总占位数,并判断和输入n的关系,总占位数小于n的话说明,第n位不在目前的范围內,继续累加;否则,说明在范围,然后找到相应数字返回。举个例子秒懂:假设输入n为14,我们想找到第14位:(1原创 2020-10-04 18:01:37 · 172 阅读 · 0 评论 -
n个骰子的点数
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。题目大意:简单来说,n个骰子同时掷出,题目要我们求每个点数的概率组成的数组(以下简称点数概率数组)解题思路:根据动态规划的思想分解子问题。我们可以把n个骰子的点数分解为n-1个骰子的点数加上一个骰子的点数。根据1个骰子的点数概率数组求出2的点数概率数组,根据2的点数概率数组求出3的点数概率数原创 2020-10-04 12:18:24 · 196 阅读 · 0 评论 -
java中栈、队列、双端队列的初始化
栈的初始化Deque<Integer> stack = new LinkedList<Integer>();入栈:push();出栈:pop();取栈顶元素:peek();队列的初始化Deque<Integer> queue= new LinkedList<Integer>();插入队头/队尾元素:addFirst()、addLast()删除队头/队尾元素:removeFirst()、removeLast()获取队头/队尾元素:g.原创 2020-10-03 16:03:40 · 3493 阅读 · 0 评论 -
和为s的连续正数序列
剑指 Offer 57 - II. 和为s的连续正数序列输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。滑动窗口可以看成数组中框起来的一个部分。在一些数组类题目中,我们可以用滑动窗口来观察可能的候选结果。当滑动窗口从数组的左边滑到了右边,我们就可以从所有的候选结果中找到最优的结果。对于这道题来说,数组就是正整数序列 [1, 2, 3, , n]。我们设滑动窗口的左边界为 i,右边界为 j,则滑原创 2020-09-29 21:27:55 · 106 阅读 · 0 评论 -
n & (n - 1)的用法
(n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,此 1 右边的 0 都变成 1 。n & (n - 1) 解析: 二进制数字 n 最右边的 1 变成 0 ,其余不变。例题1:剑指 Offer 15. 二进制中1的个数请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。public class Solution { public int hammingWe原创 2020-09-24 20:14:04 · 2954 阅读 · 0 评论 -
树的子结构
题解原创 2020-09-23 20:57:06 · 75 阅读 · 0 评论