剑指offer -- java题解
剑指offer -- java题解
- 刷题地址
- 1、数字在升序数组中出现的次数
- 2、二叉搜索树的第k个节点
- 3、二叉树的深度
- 4、数组中只出现一次的两个数字
- 5、和为S的两个数字
- 6、左旋转字符串
- 7、滑动窗口的最大值
- 8、扑克牌顺子
- 9、孩子们的游戏(圆圈中最后剩下的数)
- 10、买卖股票的最好时机(一)
刷题地址
https://www.nowcoder.com/exam/oj/ta?tpId=13
1、数字在升序数组中出现的次数
给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数
[1,2,3,3,3,3,4,5],3
4
解析
用二分查找找到 k + 0.5 的位置(k的最后一位的后一位)和 k−0.5(k的第一位)的位置,二者相减就是k出现的次数。
代码
public class Solution {public int GetNumberOfK(int [] array , int k) {return binsearch(array, k + 0.5) - binsearch(array, k - 0.5);}private int binsearch(int [] array, double k){int l = 0;int r = array.length - 1;while(l <= r){int mid = l + (r - l) / 2;if(array[mid] < k){l = mid + 1;}else if(array[mid] > k){r = mid - 1;}}return l;}
}
2、二叉搜索树的第k个节点
给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。
1.返回第k小的节点值即可
2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1
3.保证n个节点的值不一样
解析
二叉搜索树中序遍历(左中右)序列正好是由小到大的次序,因此递归中序遍历,也就是从最小的一个节点开始,找到k个就是我们要找的目标
代码
public class Solution {int count = 0;public int KthNode (TreeNode proot, int k) {// write code hereTreeNode res = midOrder(proot, k);if(res != null) return res.val;return -1;}private TreeNode midOrder(TreeNode root, int k){if(root == null || count > k) return null;TreeNode left = midOrder(root.left, k);if(left != null) return left;count++;if(count == k) return root;return midOrder(root.right, k);}
}
3、二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。
解析
dfs
代码
public class Solution {public int TreeDepth(TreeNode root) {if(root == null) return 0;return Math.max(TreeDepth(root.left), TreeDepth(root.right)) + 1;}
}
4、数组中只出现一次的两个数字
一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解析
假设要找的两个数为a, b;数组中所有数逐个异或,即x1 ^ x2 ^ y1 ^ y2 ^ …… ^ a ^ b, 最终成对的数根据归零率变成0,再根据恒等率剩下的一定是a ^ b
从a ^ b中可以获得某种信息:因为a != b所以a ^ b一定不为0,它其中某一位为1,根据这一位可以把a和b区分开(因为异或是两个输入不同时为1,相同时为0)
a & (-a)可以找到最右侧的1
代码
public class Solution {public int[] FindNumsAppearOnce (int[] array) {int eor = 0;for(int num : array){eor ^= num;}int a_b = 0;//找到最右边第一个不相等的1int rightOne = eor & (~eor + 1);for(int num : array){if((num & rightOne) == 0){a_b ^= num;}}int min = a_b < (a_b ^ eor) ? a_b : (a_b ^ eor);int max = min ^ eor;return new int[]{min, max};}
}
5、和为S的两个数字
输入一个升序数组 array 和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回任意一组即可,如果无法找出这样的数字,返回一个空数组即可。
解析
使用双指针指向数组第一个元素和最后一个元素,然后双指针对撞移动,如果两个指针下的和正好等于目标值sum,那我们肯定找到了,如果和小于sum,说明我们需要找到更大的,那只能增加左边的元素,如果和大于sum,说明我们需要找更小的,只能减小右边的元素。
代码
import java.util.ArrayList;
public class Solution {public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {ArrayList<Integer> res = new ArrayList<>();int l = 0, r = array.length - 1;while(l < r){int s = array[l] + array[r];if(s < sum){l++;}else if(s > sum){r--;}else{res.add(array[l]);res.add(array[r]);break;}}return res;}
}
6、左旋转字符串
解析
三次反转
代码
public class Solution {public String LeftRotateString(String str,int n) {if(str.isEmpty() || str.length() == 0)return "";int len = str.length();int m = n % len;char[] s = str.toCharArray();reverse(s, 0, len - 1);reverse(s, 0, len - 1 - m);reverse(s, len - m, len - 1);return new String(s);}private void reverse(char[] s, int l ,int r){while(l < r){char temp = s[l];s[l] = s[r];s[r] = temp;l++;r--;}}
}
7、滑动窗口的最大值
给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。
解析
单调队列维护窗口的最大值
代码
import java.util.*;
public class Solution {public ArrayList<Integer> maxInWindows(int [] num, int size) {ArrayList<Integer> res = new ArrayList<>();Deque<Integer> deque = new LinkedList<>();if(num == null || size == 0 || size > num.length) return res;for(int i = 0; i < num.length; i++){//单调队列while(!deque.isEmpty() && num[i] > num[deque.peekLast()]){deque.pollLast();}deque.offerLast(i);//维护窗口while(!deque.isEmpty() && deque.peekFirst() < (i - size + 1)){deque.pollFirst();}if(i - size + 1 >= 0) res.add(num[deque.peekFirst()]);}return res;}
}
8、扑克牌顺子
现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
- A为1,J为11,Q为12,K为13,A不能视为14
- 大、小王为 0,0可以看作任意牌
- 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]
解析
创建一个哈希表,查找重复:遍历数组的同时,遇到非零牌重复,直接不行,若没有重复则加入到哈希表中,等待后续的查找。同时在遍历过程需要记录数组最大值与最小值,最后检查最大值与最小值的差是否大于4,小于4的话,在没有非零牌重复的情况下,最大值与最小值中间的牌加上0牌就可以填满这手顺子
代码
import java.util.*;
public class Solution {public boolean IsContinuous(int [] numbers) {HashMap<Integer, Integer> map = new HashMap<>();int max = -1;int min = 14;for(int i = 0; i < numbers.length; i++){if(numbers[i] == 0) continue;if(map.containsKey(numbers[i])) return false;map.put(numbers[i], i);if(numbers[i] > max) max = numbers[i];if(numbers[i] < min) min = numbers[i];}System.out.println(max);System.out.println(min);if(max - min > 4) return false;return true;}
}
9、孩子们的游戏(圆圈中最后剩下的数)
每年六一儿童节,牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中,有个游戏是这样的:首先,让 n 个小朋友们围成一个大圈,小朋友们的编号是0~n-1。然后,随机指定一个数 m ,让编号为0的小朋友开始报数。每次喊到 m-1 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0… m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客礼品,请你试着想下,哪个小朋友会得到这份礼品呢?
解析
利用约瑟夫问题的递推公式 f(n,m) = (f(n-1,m) +m)%n)
公式递推:
令f(n,m)表示最后一个人的下标。
- 假设有n个人,报数m, 从0 开始报数,易知出圈的人下标为 m-1。
- m-1 出圈后,我们对剩余人重新编号 即 第m个人下标为0,第m+1 下标为1 …以此编号。 那么重新编号之后,那么最后一个人的下标为f(n-1,m)
问题1: 在重新编号之后的f(n-1,m) 与 重新编号之前的f(n,m)有什么关系?
重新编号之前 m, m+1,m+2,…
重新编号之后 0 ,1 ,2,…
可知(新编号+m)%n = 旧编号
- f(n,m) = (f(n-1,m)+m) %n;
代码
public class Solution {public int LastRemaining_Solution(int n, int m) {if(n == 0 || m == 0) return -1;return dfs(n, m);}private int dfs(int n, int m){if(n == 1) return 0;int x = dfs(n - 1, m);return (x + m) % n;}
}
10、买卖股票的最好时机(一)
假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天
2.如果不能获取到任何利润,请返回0
3.假设买入卖出均无手续费
解析
贪心算法
代码
public class Solution {public int maxProfit (int[] prices) {int res = 0, min = prices[0];for(int i = 1; i < prices.length; i++){if(prices[i] < min){min = prices[i];}res = Math.max(res, prices[i] - min);}return res;}
}
相关文章:
剑指offer -- java题解
剑指offer -- java题解刷题地址1、数字在升序数组中出现的次数2、二叉搜索树的第k个节点3、二叉树的深度4、数组中只出现一次的两个数字5、和为S的两个数字6、左旋转字符串7、滑动窗口的最大值8、扑克牌顺子9、孩子们的游戏(圆圈中最后剩下的数)10、买卖股票的最好时机(一)刷题…...
若依ruoyi——手把手教你制作自己的管理系统【二、修改样式】
阿里图标一( ̄︶ ̄*)) 图片白嫖一((* ̄3 ̄)╭ ********* 专栏略长 爆肝万字 细节狂魔 请准备好一键三连 ********* 运行成功后: idea后台正常先挂着 我习惯用VScode操作 当然如果有两台机子 一个挂后台一个改前端就更好…...
2023.2.14每日一题——455. 分发饼干
每日一题题目描述解题核心解法一:双指针题目描述 题目链接:455. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],…...
MySQL入门篇-MySQL常用字符函数小结
备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊常见的字符函数 函数名函数用途UPPER()返回大写的字符LOWER()返回小写的字符LTRIM()左边去掉空格TRIM()去掉空格RTRIM()右边去掉空格SPACE()返回指定长度的空格CONCAT()连接字符串CONCAT_WS()指定分隔符连接字符串CHAR_LEN…...
解决不同影像裁剪后栅格数据行列不一致问题
前言在处理栅格数据时,尽管用同一个矢量文件裁剪栅格数据,不同数据来源的栅格行列数也会出现不一致的情况。如果忽略或解决不好,会导致后续数据处理出现意想不到的误差或错误,尤其是利用编程实现数据处理时。因此,应当…...
visual studio2022配置opencv
标题:在vs下配置使用opencv 流程: 1、下载安装opencv 2、添加环境变量 3、vs中配置属性 4、使用 5、可能遇到的报错和解决 1、 下载安装opencv 官网下载地址: https://opencv.org/releases/ 我这里是windows环境,所以选择点击w…...
什么是销售管理?销售管理的五大职能
销售管理听起来很简单,似乎只是负责销售并确保客户满意,但事实上,它远不止于此。 销售管理的实际职能包括监督销售团队的工作,制定计划和设定目标,通常还包括确保销售流程的效率以获得最佳业务结果。 什么是销售管理…...
[CVPR‘22] EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks
paper: https://nvlabs.github.io/eg3d/media/eg3d.pdfproject: EG3D: Efficient Geometry-aware 3D GANscode: GitHub - NVlabs/eg3d总结: 本文提出一种hybrid explicit-implicit 3D representation: tri-plane hybrid 3D representation,该方法不仅有…...
Learning C++ No.9【STL No.1】
引言: 北京时间:2023/2/13/18:29,开学正式上课第一天,直接上午一节思想政治,下午一节思想政治,生怕我们……,但,我深知该课的无聊,所以充分利用时间,把我的小…...
Apifox推荐-django后台验证token配置
最近事情很多,但是我还是想写一片推荐apifox的文章。 优秀的UI,清晰地逻辑,丰富的功能。对于我们这种业余选手来说,他真的很便利。 更新新版后有了更多贴心的功能,让你感觉他是一个有温度的工具。 最重要的是…...
SAS应用入门学习笔记6
SQL (SAS): Features: 1)不需要在每个query中重复调用每个SQL; 2)每个statement都是独立去完成的; 3)我们是没有proc print和proc sort语句的;(order by) key synta…...
【3D目标检测】Pseudo-Stereo for Monocular 3D Object Detection in Autonomous Driving
目录概述细节背景与整体流程图像级别生成特征级别生成损失函数学习深度感知的特征概述 本文是基于单目图像的3D目标检测方法。 【2021】【MonoDLE】 研究的问题: 能否借助立体图像检测算法提高单目图像检测的效果如何实现右侧图像的生成 解决的方法: 受启发于伪…...
git 常用命令之 git branch
大家好,我是 17。 新建 git 分支 分支是并行开发的基础。分支名称的本质是对分支最后一个提交的引用。分支有多个,但 HEAD 只有一个,可以认为 HEAD 是"current branch"(当下的分支)。当你用git switch切换分支的时候,…...
Oracle数据泵
Oracle 数据泵:概览 作为一个基于服务器的用于高速移动数据与元数据的工具, Oracle 数据泵具有以下特点: •可通过 DBMS_DATAPUMP 调用 •可提供以下工具: – expdp – impdp – 基于 Web 的界面 •提供四种数据移动方法ÿ…...
ACWING寒假每日一题python
ACWING寒假每日一题 一、孤独的照片 一个点一个点的来看,比如对于GHGHG中间的G,找到他的左边的G,以及右边的G的位置,l,r分别等于1,答案就要多加上11 但是如果对于 GHHGHHG 中间的G,我们可以看到l,r等于2&a…...
御黑行动来袭--助力三月重保,构筑安全防线!
三月重保在即,重要网站及业务系统“零风险 零事故”是终极目标,作为业界网络安全实战派“老兵”--知道创宇将一如既往,为您提供重保期间“万无一失”的重要网站及业务系统防护。 值此三月重保的重要备战期,知道创宇推出由主力产品…...
JavaScript HTML DOM 元素 (节点)
HTML DOM 是指 HTML 文档对象模型,它是一种用于创建和处理 HTML 页面的标准 API。在 JavaScript 中,HTML DOM 可以被用来操作和修改网页的内容和结构。在本篇文章中,我们将详细探讨 JavaScript HTML DOM 元素 (节点)的作用以及在实际工作中的…...
mybatis-plus ---2
mybatis-plus插件 官网地址 分页插件 MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能 配置并使用自带分页插件 Configuration MapperScan("com.itzhh.mapper")//可以将主类中的注解移到此处 public class MybatisPlusConfig {Beanpublic …...
如何在Qt中设置背景图片,且不覆盖其它控件
正常情况,我们直接通过在样式表里设置背景图片会出现背景图片覆盖其它控件的情况,比如下面操作: 首先右击空白处,点击改变样式表。 然后选择background-image 然后点击铅笔图标 之后我们要先添加前缀,也就是我们…...
PMP考前冲刺2.14 | 2023新征程,一举拿证
承载2023新一年的好运让我们迈向PMP终点一起冲刺!一起拿证!每日5道PMP习题助大家上岸PMP!!!PMP项目管理题目1-2:1.公司了解到一个项目机会,领导让之前做过类似项目的项目经理报告一个粗略的成本…...
feign进行文件上传报错解决方案及有多个入参时的注意事项
一、情景回顾1、简单的文件上传的接口/*** 文件上传MultipartFile格式** param multipartFile 源文件* param filename 自定义文件名称,允许为空,为空时直接从源文件中拿* return*/RequestMapping("/uploadFileForMultipartFile")LogModuleAnn…...
java 枚举类型enum的用法详解
Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。 因此,在比较两个枚举类型的值时,永远不需要调用equals方法…...
Java 基础面试题——关键字
目录1.Java 中的关键字是指什么?有哪些关键字?2.instanceof 关键字的作用是什么?3.访问修饰符 public、private、protected、以及不写(default)时的区别?4.Java 中有没有 goto 关键字?5.在 Java 中&#x…...
C++——运算符重载
1、运算符重载的概念 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。运算符重载的目的是让语法更加简洁运算符重载不能改变本来寓意,不能改变基础类型寓意运算符重载的本质是另一种函数调用…...
前端食堂技术周刊第 70 期:Volar 的新开端、Lighthouse 10、良好的组件设计、React 纪录片、2022 大前端总结
美味值:🌟🌟🌟🌟🌟 口味:黑巧克力 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 Volar 的新开端Chrome 110 的新功能Lighthouse 10Nuxt v3.2.0加速 JavaSc…...
react路由详解
在学习react路由之前,我们肯定需要安装路由。大家先运行如下命令安装路由。安装之后随我一起探索react路由。 安装 版本v6 npm i react-router-dom -S 页面准备 创建两个文件夹 pages和 router pages文件夹里面放的是页面 router文件夹里面是进行路由配置 路由…...
mysql数据库完全备份和增量备份与恢复
mysql数据备份: 数据备份方式 物理备份: 冷备:.冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库热备:一般用于保证服务正常不间断运行,用两台机器作为服务机器,一台用于实际数据库操作应用,另外…...
CF1667E Centroid Probabilities
题目描述 对于所有点数为 nnn 的树,如果其满足 对于所有 i∈[2,n]i\in [2,n]i∈[2,n],与 iii 相连的 jjj 中有且只有一个点 jjj 满足 j<ij<ij<i ,那么我们称其为好树 对于 1∼n1\sim n1∼n 每个点求出来有多少好树满足重心为 iii …...
全网详细总结com.alibaba.fastjson.JSONException: syntax error, position at xxx常见错误方式
文章目录1. 复现问题2. 分析问题3. 解决问题4. 该错误的其他解决方法5. 重要补充1. 复现问题 今天在JSONObject.parse(json)这个方法时,却报出如下错误: com.alibaba.fastjson.JSONException: syntax error, position at 0, name usernameat com.aliba…...
快速部署个人导航页:美好的一天从井然有序开始
很多人都习惯使用浏览器自带的收藏夹来管理自己的书签,然而收藏夹存在着一些问题。 经过长时间的累积,一些高频使用的重要网站和偶尔信手收藏的链接混在了一起,收藏夹因为内容过多而显得杂乱无章;收藏夹没有什么美观可言…...
做网站的计划概要/简述网络推广的方法
1.javaScript 中const、var、let区别 const 定义的变量不可修改 而且必须初始化 >解决闭包变量污染问题 var 定义的变量可以修改 如果不初始化则默认值为undefined let 是块级作用域 函数内部使用let定义后 对函数外部不影响 2.浅拷贝 object.assign(target,source) 等…...
做qq头像的网站/seo的作用是什么
Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。本文详细介绍了Node.js的安装和使用。 一、Node.js介绍 Node.js 不是一个 JavaScript 框架,不同于Cak…...
网泰网站建设网络/黑帽seo培训网
有些想入门学习测试的朋友问我,我都30了,还能不能做软件测试?我本来想直接回答,但回答的明显字数不够用。所以就干脆就把想说的都记录下来写一篇文章。 1.我今年30岁了,还适不适合做软件测试? 首先&#…...
网站结构优化包括什么/百度提问在线回答问题
下载源码: https://github.com/yanfengliu/cython_bbox.git 然后 cd cython_bbox-master python setup.py install 即可安装,注意你直接使用pip install cython_bbox是装不上的...
wordpress打不开仪表盘/四川整站优化关键词排名
下面是在看python核心编程中序列字符串中提到的一些函数,根据自己的学习理解总结了下,方便日后用到的时候查看。 1、string.capitalize() 把字符串的第一个字符大写 例子: a name is : print a.capitalize() 》Name is…...
东莞网站开发定制/网站排名优化方案
在我国历史上曾呈“众山皆有”的东北虎,如今濒临灭绝的危险。受人类活动增加、森林砍伐、栖息地退化等多种因素的影响,野生东北虎种群及其栖息地在不断地萎缩,自2012年至2015年期间,有关部门在中国境内通过野外红外相机仅监测到不…...