当前位置: 首页 > news >正文

剑指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副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:

  1. A为1,J为11,Q为12,K为13,A不能视为14
  2. 大、小王为 0,0可以看作任意牌
  3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出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)表示最后一个人的下标。

  1. 假设有n个人,报数m, 从0 开始报数,易知出圈的人下标为 m-1。
  2. 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 = 旧编号
  3. 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——手把手教你制作自己的管理系统【二、修改样式】

阿里图标一(&#xffe3;︶&#xffe3;*)) 图片白嫖一((*&#xffe3;3&#xffe3;)╭ ********* 专栏略长 爆肝万字 细节狂魔 请准备好一键三连 ********* 运行成功后&#xff1a; idea后台正常先挂着 我习惯用VScode操作 当然如果有两台机子 一个挂后台一个改前端就更好…...

2023.2.14每日一题——455. 分发饼干

每日一题题目描述解题核心解法一&#xff1a;双指针题目描述 题目链接&#xff1a;455. 分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;…...

MySQL入门篇-MySQL常用字符函数小结

备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊常见的字符函数 函数名函数用途UPPER()返回大写的字符LOWER()返回小写的字符LTRIM()左边去掉空格TRIM()去掉空格RTRIM()右边去掉空格SPACE()返回指定长度的空格CONCAT()连接字符串CONCAT_WS()指定分隔符连接字符串CHAR_LEN…...

解决不同影像裁剪后栅格数据行列不一致问题

前言在处理栅格数据时&#xff0c;尽管用同一个矢量文件裁剪栅格数据&#xff0c;不同数据来源的栅格行列数也会出现不一致的情况。如果忽略或解决不好&#xff0c;会导致后续数据处理出现意想不到的误差或错误&#xff0c;尤其是利用编程实现数据处理时。因此&#xff0c;应当…...

visual studio2022配置opencv

标题&#xff1a;在vs下配置使用opencv 流程&#xff1a; 1、下载安装opencv 2、添加环境变量 3、vs中配置属性 4、使用 5、可能遇到的报错和解决 1、 下载安装opencv 官网下载地址&#xff1a; https://opencv.org/releases/ 我这里是windows环境&#xff0c;所以选择点击w…...

什么是销售管理?销售管理的五大职能

销售管理听起来很简单&#xff0c;似乎只是负责销售并确保客户满意&#xff0c;但事实上&#xff0c;它远不止于此。 销售管理的实际职能包括监督销售团队的工作&#xff0c;制定计划和设定目标&#xff0c;通常还包括确保销售流程的效率以获得最佳业务结果。 什么是销售管理…...

[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总结&#xff1a; 本文提出一种hybrid explicit-implicit 3D representation: tri-plane hybrid 3D representation&#xff0c;该方法不仅有…...

Learning C++ No.9【STL No.1】

引言&#xff1a; 北京时间&#xff1a;2023/2/13/18:29&#xff0c;开学正式上课第一天&#xff0c;直接上午一节思想政治&#xff0c;下午一节思想政治&#xff0c;生怕我们……&#xff0c;但&#xff0c;我深知该课的无聊&#xff0c;所以充分利用时间&#xff0c;把我的小…...

Apifox推荐-django后台验证token配置

最近事情很多&#xff0c;但是我还是想写一片推荐apifox的文章。 优秀的UI&#xff0c;清晰地逻辑&#xff0c;丰富的功能。对于我们这种业余选手来说&#xff0c;他真的很便利。 更新新版后有了更多贴心的功能&#xff0c;让你感觉他是一个有温度的工具。 最重要的是&#xf…...

SAS应用入门学习笔记6

SQL (SAS): Features&#xff1a; 1&#xff09;不需要在每个query中重复调用每个SQL&#xff1b; 2&#xff09;每个statement都是独立去完成的&#xff1b; 3&#xff09;我们是没有proc print和proc sort语句的&#xff1b;&#xff08;order by&#xff09; key synta…...

【3D目标检测】Pseudo-Stereo for Monocular 3D Object Detection in Autonomous Driving

目录概述细节背景与整体流程图像级别生成特征级别生成损失函数学习深度感知的特征概述 本文是基于单目图像的3D目标检测方法。 【2021】【MonoDLE】 研究的问题: 能否借助立体图像检测算法提高单目图像检测的效果如何实现右侧图像的生成 解决的方法&#xff1a; 受启发于伪…...

git 常用命令之 git branch

大家好&#xff0c;我是 17。 新建 git 分支 分支是并行开发的基础。分支名称的本质是对分支最后一个提交的引用。分支有多个&#xff0c;但 HEAD 只有一个&#xff0c;可以认为 HEAD 是"current branch"(当下的分支)。当你用git switch切换分支的时候&#xff0c;…...

Oracle数据泵

Oracle 数据泵&#xff1a;概览 作为一个基于服务器的用于高速移动数据与元数据的工具&#xff0c; Oracle 数据泵具有以下特点&#xff1a; •可通过 DBMS_DATAPUMP 调用 •可提供以下工具&#xff1a; – expdp – impdp – 基于 Web 的界面 •提供四种数据移动方法&#xff…...

ACWING寒假每日一题python

ACWING寒假每日一题 一、孤独的照片 一个点一个点的来看&#xff0c;比如对于GHGHG中间的G&#xff0c;找到他的左边的G&#xff0c;以及右边的G的位置&#xff0c;l,r分别等于1&#xff0c;答案就要多加上11 但是如果对于 GHHGHHG 中间的G&#xff0c;我们可以看到l,r等于2&a…...

御黑行动来袭--助力三月重保,构筑安全防线!

三月重保在即&#xff0c;重要网站及业务系统“零风险 零事故”是终极目标&#xff0c;作为业界网络安全实战派“老兵”--知道创宇将一如既往&#xff0c;为您提供重保期间“万无一失”的重要网站及业务系统防护。 值此三月重保的重要备战期&#xff0c;知道创宇推出由主力产品…...

JavaScript HTML DOM 元素 (节点)

HTML DOM 是指 HTML 文档对象模型&#xff0c;它是一种用于创建和处理 HTML 页面的标准 API。在 JavaScript 中&#xff0c;HTML DOM 可以被用来操作和修改网页的内容和结构。在本篇文章中&#xff0c;我们将详细探讨 JavaScript HTML DOM 元素 (节点)的作用以及在实际工作中的…...

mybatis-plus ---2

mybatis-plus插件 官网地址 分页插件 MyBatis Plus自带分页插件&#xff0c;只要简单的配置即可实现分页功能 配置并使用自带分页插件 Configuration MapperScan("com.itzhh.mapper")//可以将主类中的注解移到此处 public class MybatisPlusConfig {Beanpublic …...

如何在Qt中设置背景图片,且不覆盖其它控件

正常情况&#xff0c;我们直接通过在样式表里设置背景图片会出现背景图片覆盖其它控件的情况&#xff0c;比如下面操作&#xff1a; 首先右击空白处&#xff0c;点击改变样式表。 然后选择background-image 然后点击铅笔图标 之后我们要先添加前缀&#xff0c;也就是我们…...

PMP考前冲刺2.14 | 2023新征程,一举拿证

承载2023新一年的好运让我们迈向PMP终点一起冲刺&#xff01;一起拿证&#xff01;每日5道PMP习题助大家上岸PMP&#xff01;&#xff01;&#xff01;PMP项目管理题目1-2&#xff1a;1.公司了解到一个项目机会&#xff0c;领导让之前做过类似项目的项目经理报告一个粗略的成本…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...