剑指offer刷题
文章平均质量分 62
不懂程序的程序猿
努力学习
改变命运
展开
-
剑指 Offer 第八天
剑指 Offer 43. 1~n 整数中 1 出现的次数public int countDigitOne(int n) { int digit = 1, res = 0; int high = n / 10, cur = n % 10, low = 0; while(high != 0 || cur != 0) { if(cur == 0) res += high * digit; else if(cur == 1) res += high * di原创 2021-07-16 20:22:28 · 102 阅读 · 0 评论 -
剑指offer第七天
剑指 Offer 36. 二叉搜索树与双向链表dfs(cur):递归中序遍历终止条件:当前节点为空,直接返回递归左子树,dfs(cur.left)构建链表:当pre为空时,代表正在访问头节点,记为head当pre不为空时,修改双向节点引用,即pre.right = cur,cur.left=pre保存cur:更新 :pre=cur递归右子树treeToDoublyList(root)特殊处理:若root为空,直接返回初始化:空节点pre转化为双向链表:调用dfs构建循原创 2021-07-16 20:21:56 · 90 阅读 · 0 评论 -
剑指 Offer 第九天
剑指 Offer 46. 把数字翻译成字符串加了条件的青蛙跳格子public int translateNum(int num){ String s = String.valueOf(num); int a = 1,b = 1; for(int i = 2;i<=s.lengh();i++){ String tmp = s.substring(i-2,i); int c=tmp.compareTo("10")>=0 &&原创 2021-07-16 20:19:35 · 96 阅读 · 0 评论 -
剑指 Offer第六天
剑指 Offer 32 - II. 从上到下打印二叉树 II按层打印:BFS->队列的先入先出特性来实现每层打印到一行算法流程:特例处理:当根节点为空,则返回空列表初始化:打印结果res=[],包含根节点的队列queue=[root]BFS循环:当队列为空时跳出新建一个临时列表tmp,用于存储当前打印结果当前层循环打印:循环次数为当前层的节点数,即此时队列的长度:出队:队首元素出队,记为node;打印:将节点值添加至tmp尾部添加子节点:若左右子节点不为空,则加入队列原创 2021-07-10 17:22:52 · 59 阅读 · 0 评论 -
剑指offer第五天
剑指 Offer 22. 链表中倒数第k个节点思路:双指针:让快指针先走k步,这样快慢指针一起走,快指针走到尾部的时候,慢指针刚好走到了n-k处代码:class Solution { public ListNode getKthFromEnd(ListNode head, int k) { ListNode slow = head, fast = head; for(int i = 0; i < k; i++){ fast =原创 2021-07-09 21:30:56 · 60 阅读 · 0 评论 -
剑指offer第四天
1.剑指 Offer 17. 打印从1到最大的n位数思路:最大的一位数是9,最大的两位数是99,因此可以推导出end = 10的n次方减一,步长为1做循环即可。代码:class Solution { public int[] printNumbers(int n) { int end = (int)Math.pow(10,n)-1; int[] res = new int[end]; for(int i=0;i<end;i++){原创 2021-05-27 16:34:59 · 57 阅读 · 0 评论 -
剑指 Offer第三天
1.剑指 Offer 13. 机器人的运动范围思路:设计到搜索题目,一般用广度优先(队列)或者深度优先(递归)来解决。数位之和计算:设一个数字x,将x对10取余可以求得其个位数,对x向下取整即向右移动一位,可以删除个位数得到十位数。 因此可以通过循环求得数位之和s int sums(int x) int s=0; while(x!=0){ s+=x%10; x=x/10; } return s;数位和原创 2021-05-26 11:00:01 · 65 阅读 · 0 评论 -
剑指offer刷题第二天
1.剑指 Offer 09. 用两个栈实现队列思路:先append是数据一定是存在栈底的,所以要删除的话,就必须要取出来,不能直接删,可以先将数据从栈中pop出来,然后Push到另一个栈中,这样就变成栈顶元素了,然后pop栈顶元素就可以了。增加尾部数据的话,直接就在第一个栈中加就行了。代码:class CQueue{ Stack<Integer> stack1; Stack<Integer> stack2; public CQueue(){原创 2021-05-25 12:12:27 · 73 阅读 · 0 评论 -
剑指offer刷题第一天
1.剑指 Offer 03. 数组中重复的数字方法一:哈希表法看到重复的数字,首先想到哈希表(set)记录数组中各个数字,具体方法是先新建一个hashset,然后遍历数组中的每一个数字num:当num在表中,则返回num,最后将Num添加到哈希表中。返回-1.因为本题中一定有重复数字,返回其他值也行。代码:class Solution { public int findRepeatNumber(int[] nums) { HashSet <Integer>原创 2021-05-24 16:10:22 · 73 阅读 · 0 评论