CSDN每日一题学习训练——Java版(分数到小数、罗马数字转整数、x 的平方根)
版本说明
当前版本号[20231114]。
| 版本 | 修改说明 |
|---|---|
| 20231114 | 初版 |
目录
文章目录
- 版本说明
- 目录
- 分数到小数
- 题目
- 解题思路
- 代码思路
- 参考代码
- 罗马数字转整数
- 题目
- 解题思路
- 代码思路
- 参考代码
- x 的平方根
- 题目
- 解题思路
- 代码思路
- 参考代码
分数到小数
题目
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 104 。
示例 1:
输入:numerator = 1, denominator = 2
输出:“0.5”
示例 2:
输入:numerator = 2, denominator = 1
输出:“2”
示例 3:
输入:numerator = 2, denominator = 3
输出:“0.(6)”
示例 4:
输入:numerator = 4, denominator = 333
输出:“0.(012)”
示例 5:
输入:numerator = 1, denominator = 5
输出:“0.2”
提示:
-231 <= numerator, denominator <= 231 - 1
denominator != 0
解题思路
- 首先判断分子是否为0,如果为0则直接返回"0"。
- 创建一个StringBuilder对象str,用于存储结果字符串。
- 判断分子和分母的符号是否不同,如果不同则在结果字符串前加上负号。
- 将分子和分母转换为绝对值,并计算商,将其添加到结果字符串中。
- 计算余数remainter。
- 如果余数为0,说明已经完成了转换,直接返回结果字符串。
- 在结果字符串后加上一个小数点。
- 创建一个HashMap对象map,用于记录已经出现过的余数及其位置。
- 当余数不为0时,执行以下操作: a. 检查map中是否已经存在当前的余数,如果存在,说明出现了循环小数,将循环部分括在括号内,并插入到正确的位置。 b. 将当前的余数和其在结果字符串中的位置添加到map中。 c. 将余数乘以10,得到下一位小数。 d. 将下一位小数添加到结果字符串中。 e. 更新余数。
- 返回结果字符串。
代码思路
-
首先检查分子是否为0,如果是,则直接返回"0"。
// 如果分子为0,直接返回"0"if (numerator == 0)return "0"; -
创建一个StringBuilder对象str,用于构建结果字符串。
-
检查分子和分母的符号是否不同,如果不同,则在结果字符串前加上负号。
// 如果分子和分母的符号不同,需要在结果字符串前加上负号if (numerator < 0 ^ denominator < 0)str.append('-'); -
计算分子和分母的绝对值,并将它们转换为长整型dividend和divisor。
// 计算分子和分母的绝对值,并将它们转换为长整型long dividend = Math.abs(Long.valueOf(numerator));long divisor = Math.abs(Long.valueOf(denominator)); -
将商添加到结果字符串中。
// 将商添加到结果字符串中str.append(String.valueOf(dividend / divisor)); -
计算余数remainter。
// 计算余数long remainter = dividend % divisor; -
如果余数为0,说明已经完成了转换,直接返回结果字符串。
// 如果余数为0,说明已经完成了转换,直接返回结果字符串if (remainter == 0)return str.toString(); -
在结果字符串后加上一个小数点。
// 在结果字符串后加上一个小数点str.append('.'); -
创建一个哈希表map,用于记录已经出现过的余数。
// 创建一个哈希表,用于记录已经出现过的余数Map<Long, Integer> map = new HashMap<>(); -
当余数不为0时,继续进行转换: a. 如果哈希表中已经存在当前的余数,说明出现了循环节,需要插入括号。
// 当余数不为0时,继续进行转换while (remainter != 0) {// 如果哈希表中已经存在当前的余数,说明出现了循环节,需要插入括号if (map.containsKey(remainter)) {str.insert(map.get(remainter), "(");str.append(")");break;} -
b. 将当前的余数和它在结果字符串中的位置添加到哈希表中。
// 将当前的余数和它在结果字符串中的位置添加到哈希表中map.put(remainter, str.length()); -
c. 将余数乘以10,得到下一位小数。
// 将余数乘以10,得到下一位小数remainter *= 10; -
d. 将下一位小数添加到结果字符串中。
// 将下一位小数添加到结果字符串中str.append(String.valueOf(remainter / divisor)); -
e. 更新余数。
// 更新余数remainter %= divisor; -
返回最终的结果字符串。
// 返回最终的结果字符串return str.toString();
参考代码
这段代码是将一个分数转换为小数表示。
class Solution {public String fractionToDecimal(int numerator, int denominator) {if (numerator == 0)return "0";StringBuilder str = new StringBuilder();if (numerator < 0 ^ denominator < 0)str.append('-');long dividend = Math.abs(Long.valueOf(numerator));long divisor = Math.abs(Long.valueOf(denominator));str.append(String.valueOf(dividend / divisor));long remainter = dividend % divisor;if (remainter == 0)return str.toString();str.append('.');Map<Long, Integer> map = new HashMap<>();while (remainter != 0) {if (map.containsKey(remainter)) {str.insert(map.get(remainter), "(");str.append(")");break;}map.put(remainter, str.length());remainter *= 10;str.append(String.valueOf(remainter / divisor));remainter %= divisor;}return str.toString();}
}
罗马数字转整数
题目
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。
示例 1:
输入: num = 3
输出: “III”
示例 2:
输入: num = 4
输出: “IV”
示例 3:
输入: num = 9
输出: “IX”
示例 4:
输入: num = 58
输出: “LVIII”
解释: L = 50, V = 5, III = 3.
示例 5:
输入: num = 1994
输出: “MCMXCIV”
解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= num <= 3999
解题思路
给定一个整数n,将其转为罗马数字。解题思路如下:
- 首先判断n是否大于等于20,因为只有当n大于等于20时,才能将数字拆分为两部分,即十位和个位。如果n小于20,那么直接返回n本身作为罗马数字即可。
- 如果n大于等于20,接下来需要将n除以10,得到商和余数。这里的商表示十位数,余数表示个位数。
- 将商作为罗马数字的十位数,余数作为罗马数字的个位数,然后将这两个部分组合起来,得到最终的罗马数字。
例如,给定整数n=56,其罗马数字为XII。
代码思路
-
初始化一个变量n为0,用于存储转换后的整数值。
-
使用for循环遍历输入的字符串s。
// 使用for循环遍历字符串s中的每个字符for (int i = 0; i < s.length();) -
在循环中,首先获取当前字符c。
// 获取当前字符cchar c = s.charAt(i); -
根据字符c的值进行判断:
-
如果c是’I’,则表示这是一个"I"字符。需要判断下一个字符是否为’V’或’X’,如果是,则将对应的整数值加到n上,并将i增加2;否则,将1加到n上,并将i增加1。
// 判断当前字符是否为'I'if (c == 'I') {// 如果当前字符后面还有字符,继续判断下一个字符if (i + 1 < s.length()) {// 如果下一个字符是'V',将4加到n上,并将i增加2if (s.charAt(i + 1) == 'V') {n += 4;i += 2;} else if (s.charAt(i + 1) == 'X') { // 如果下一个字符是'X',将9加到n上,并将i增加2n += 9;i += 2;} else { // 如果下一个字符不是'V'或'X',将1加到n上,并将i增加1n += 1;i++;}} else { // 如果当前字符后面没有字符,将1加到n上,并将i增加1n += 1;i++;}} -
如果c是’X’,则表示这是一个"X"字符。需要判断下一个字符是否为’L’或’C’,如果是,则将对应的整数值加到n上,并将i增加2;否则,将10加到n上,并将i增加1。
else if (c == 'X') { // 如果当前字符是'X',进行类似的判断和操作if (i + 1 < s.length()) {if (s.charAt(i + 1) == 'L') {n += 40;i += 2;} else if (s.charAt(i + 1) == 'C') {n += 90;i += 2;} else {n += 10;i++;}} else {n += 10;i++;}} -
如果c是’C’,则表示这是一个"C"字符。需要判断下一个字符是否为’D’或’M’,如果是,则将对应的整数值加到n上,并将i增加2;否则,将100加到n上,并将i增加1。
else if (c == 'C') { // 如果当前字符是'C',进行类似的判断和操作if (i + 1 < s.length()) {if (s.charAt(i + 1) == 'D') {n += 400;i += 2;} else if (s.charAt(i + 1) == 'M') {n += 900;i += 2;} else {n += 100;i++;}} else {n += 100;i++;}} -
如果c是’V’、‘L’、‘D’或’M’,则分别将5、50、500和1000加到n上,并将i增加1。
else if (c == 'V') { // 如果当前字符是'V',将5加到n上,并将i增加1n += 5;i++;} else if (c == 'L') { // 如果当前字符是'L',将50加到n上,并将i增加1n += 50;i++;} else if (c == 'D') { // 如果当前字符是'D',将500加到n上,并将i增加1n += 500;i++;} else if (c == 'M') { // 如果当前字符是'M',将1000加到n上,并将i增加1n += 1000;i++;}}
-
-
循环结束后,返回n作为结果。
参考代码
这段代码是将罗马数字转换为整数的函数。
class Solution {public int romanToInt(String s) {int n = 0;for (int i = 0; i < s.length();) {char c = s.charAt(i);if (c == 'I') {if (i + 1 < s.length()) {if (s.charAt(i + 1) == 'V') {n += 4;i += 2;} else if (s.charAt(i + 1) == 'X') {n += 9;i += 2;} else {n += 1;i++;}} else {n += 1;i++;}} else if (c == 'X') {if (i + 1 < s.length()) {if (s.charAt(i + 1) == 'L') {n += 40;i += 2;} else if (s.charAt(i + 1) == 'C') {n += 90;i += 2;} else {n += 10;i++;}} else {n += 10;i++;}} else if (c == 'C') {if (i + 1 < s.length()) {if (s.charAt(i + 1) == 'D') {n += 400;i += 2;} else if (s.charAt(i + 1) == 'M') {n += 900;i += 2;} else {n += 100;i++;}} else {n += 100;i++;}} else if (c == 'V') {n += 5;i++;} else if (c == 'L') {n += 50;i++;} else if (c == 'D') {n += 500;i++;} else if (c == 'M') {n += 1000;i++;}}return n;}
}
x 的平方根
题目
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
解题思路
- 初始化左边界left为0,右边界right为46340。这里选择46340是因为题目要求返回结果为整数,而46340的平方是2000000000,大于题目给定的最大整数x。
- 当左边界小于右边界时,执行循环。在循环中,首先计算中间值mid,然后根据mid的平方与x的大小关系,更新左边界或右边界。
- 如果mid的平方小于x,说明平方根在mid的右侧,将左边界更新为mid + 1。
- 如果mid的平方大于x,说明平方根在mid的左侧。此时需要判断(mid - 1)的平方是否小于等于x。如果是,说明平方根就是mid - 1,直接返回mid - 1;否则,将右边界更新为mid - 1。
- 如果mid的平方等于x,说明找到了平方根,直接返回mid。
- 如果循环结束后,左边界的平方大于x,说明平方根在左边界的左侧,将左边界减1后返回。
- 否则,直接返回左边界。
代码思路
-
初始化左边界left为0,右边界right为46340(因为题目要求返回的结果不超过32位有符号整数的范围)。
// 初始化左边界left为0,右边界right为46340int left = 0, right = 46340; -
进入循环,当left小于right时执行以下操作:
a. 计算中间值mid,即(left + right) / 2。
// 计算中间值midint mid = (left + right) / 2;b. 如果mid的平方小于x,说明平方根在mid的右侧,将left更新为mid + 1。
// 如果mid的平方小于x,说明平方根在mid的右侧if (mid * mid < x)left = mid + 1;c. 如果mid的平方大于x,说明平方根在mid的左侧,需要进一步判断:
i. 如果(mid - 1)的平方小于等于x,说明平方根就是mid - 1,直接返回mid - 1。
ii. 否则,将right更新为mid - 1。
d. 如果mid的平方等于x,说明找到了平方根,直接返回mid。
// 如果mid的平方大于x,说明平方根在mid的左侧else if (mid * mid > x)// 如果(mid - 1)的平方小于等于x,说明平方根就是mid - 1if ((mid - 1) * (mid - 1) <= x)return mid - 1;// 否则,将右边界right更新为mid - 1elseright = mid - 1;// 如果mid的平方等于x,说明找到了平方根,直接返回midelsereturn mid;} -
当循环结束后,如果left的平方大于x,说明平方根在left的左侧,将left减1后返回。
-
如果left的平方小于等于x,说明平方根就是left,直接返回left。
// 如果循环结束后,左边界的平方大于x,说明平方根在左边界的左侧,将左边界减1后返回if (left * left > x)return left - 1;// 否则,直接返回左边界return left;
参考代码
这段代码主要是使用二分查找算法来求解一个整数的平方根。
class Solution {public int mySqrt(int x) {int left = 0, right = 46340;while (left < right) {int mid = (left + right) / 2;if (mid * mid < x)left = mid + 1;else if (mid * mid > x)if ((mid - 1) * (mid - 1) <= x)return mid - 1;elseright = mid - 1;elsereturn mid;}if (left * left > x)return left - 1;return left;}
}
相关文章:
CSDN每日一题学习训练——Java版(分数到小数、罗马数字转整数、x 的平方根)
版本说明 当前版本号[20231114]。 版本修改说明20231114初版 目录 文章目录 版本说明目录分数到小数题目解题思路代码思路参考代码 罗马数字转整数题目解题思路代码思路参考代码 x 的平方根题目解题思路代码思路参考代码 分数到小数 题目 给定两个整数,分别表示…...
【2021集创赛】 RISC-V杯三等奖:基于E203 处理器的SM4算法硬件加速
杯赛题目:基于蜂鸟E203 RISC-V处理器内核的SoC设计 参赛要求:研究生组/本科生组 赛题内容: 基于芯来科技的开源蜂鸟E203 Demo SoC进行扩展,在限定的可编程逻辑平台上构建面向专用应用领域(譬如人工智能、信息安全、工业…...
SUMO道路封闭车辆绕行仿真实验【TraCI】
本文将介绍如何在 SUMO 交通模拟中动态选择车辆绕行指定道路。 绕道是城市驾驶中的常见现象,造成原因有很多,包括建筑和交通事故等。 无论出于何种原因,并非所有车辆都会选择避开这些道路; 有些人可能会毫不犹豫地直接开车过去&a…...
IDEA 无法搜索或者下载插件
File -> Settings… -> Plugins 可以打开插件市场,搜索想要下载的插件,但是可能由于网络问题而无法成功搜索或者下载插件。此时需要设置代理来解决。点击插件界面里的齿轮图标(在Marketplace、Installed的右边),…...
unity 使用Vuforia扫描实体物体交互
文章目录 前言一、Vuforia是什么?二、Unity导入Vuforia1.去Unity - Windows – Asset Store,搜vuforia engine,添加到我的资源2.从 Unity 的菜单 Assets -> Import package -> Custom Package 导入脚本,添加 Vuforia Engine…...
IDEA接口调试插件不好找?这款免费用!
IDEA插件市场中的API调试插件不是收费(Fast Request )就是不好用(apidoc、apidocx等等)今天给大家介绍一款国产的API调试插件:Apipost-Helper,完全免费且好看好用! 这款插件由Apipost团队开发的…...
OpenCV图像坐标系
绘制代码: X轴 # 选取两个点 point1 = (20, 0) point2 = (200, 0)# 在图像上绘制连接线 cv2.line(img, point1, point2, (...
【Proteus仿真】【Arduino单片机】DHT11温湿度
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用PCF8574、LCD1602液晶、DHT11温湿度传感器等。 主要功能: 系统运行后,LCD1602显示传感器采集温度和湿度。 二、软件设…...
Linux--makefile
一、makefile的作用 makefile是一个文件,是围绕依赖关系和依赖方法的自动化编译工具 一个工程中的源文件有很多,按照不同的类型、功能、模块放在不同的目录中。而makefile定义了一系列的规则来指定,那些文件需要先编译,那些文件…...
Anaconda学习备忘
Anaconda是一套用于数据处理和科学计算以及AI等领域的包管理器。 以前的误区一直以为Anaconda只有python库,现在仔细搜索学习以后,才知道它其实包含多种语言,可以直接下载各种语言生成的包。其中conda就是一套跨语言包管理器了,而…...
uniapp运行到安卓模拟器一直在“同步手机端程序文件完成“界面解决办法
如果你是用的模拟器是android studio创建的模拟器,那么你需要新创建一个android11 x86架构的模拟器: 创建完成后,启动模拟器: 然后在hbuilder中重新运行到这个模拟器就可以了: 运行结果: 如果你是用安…...
leetcode:876. 链表的中间结点
一、题目 函数原型: struct ListNode* middleNode(struct ListNode* head) 二、思路 要找到链表的中间结点,有两种思路: 暴力解法:先遍历一遍链表,计算出链表的长度,再次遍历链表,找到中间结点。…...
【m98】webrtc vs2017构建带符号的debug库
调试有符号 调试 无符号 试试exe不输出到独立的文件? -】 直接输出到sln下面...
【读点论文】结构化剪枝
结构化剪枝 在一个神经网络模型中,通常包含卷积层、汇合层、全连接层、非线形层等基本结构,通过这些基本结构的堆叠,最终形成我们所常用的深度神经网络。 早在 1998 年,LeCun 等人使用少数几个基本结构组成 5 层的 LeNet-5 网络&…...
JimuReport积木报表 v1.6.5 版本发布—免费报表工具
项目介绍 一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完成报…...
【开发工具】gitee还不用会?我直接拿捏 >_>
🌈键盘敲烂,年薪30万🌈 目录 📕揭开git面纱 📕git的一些前置操作 📕如何获取本地仓库 📕本地仓库的操作 📕远程仓库操作 📕分支操作 📕标签操作 &…...
算法通关村——位运算之位移的妙用
位移的妙用 1、位1的个数 1.1、题目描述 LeetCode191. 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位为 ‘1’ 的个数。 示例1: 输入:00000000000000000000000000001011 输出࿱…...
【开题报告】基于uni-app的高校新生报道APP的设计与实现
1.选题背景和意义 随着高校规模的不断扩大和信息化技术的迅速发展,传统的高校新生报道方式已经无法满足日益增长的新生数量和信息处理的需求。传统的线下报道流程通常存在着信息收集效率低、报到流程繁琐等问题,给学生、教职工和管理人员带来了许多不便…...
Elasticsearch docker-compose 使用 Logstash 从 JSON 文件中预加载数据
在我们创建 Elasticsearch 进行开发时,最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时,特别是在准备测试环境时,开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很…...
<文件操作及常用的API>
文章目录 专栏导读🚀简单认识一下文件🚀树形结构和目录🚀文件路径-相对路径、绝对路径🚀文件类型🚀Java中文件的操作🚀File 类的常用方法 专栏导读 🚀多线程章节 💐数据结构剖析 &am…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
【见合八方平面波导外腔激光器专题系列】用于干涉光纤传感的低噪声平面波导外腔激光器2
----翻译自Mazin Alalus等人的文章 摘要 1550 nm DWDM 平面波导外腔激光器具有低相位/频率噪声、窄线宽和低 RIN 等特点。该腔体包括一个半导体增益芯片和一个带布拉格光栅的平面光波电路波导,采用 14 引脚蝶形封装。这种平面波导外腔激光器设计用于在振动和恶劣的…...
Python基于蒙特卡罗方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融投资中,风险管理是确保资产安全和实现稳健收益的关键环节。随着市场波动性的增加,传统…...
Java中Git基础操作详解(clone、commit、push、branch)
Git是Java开发者必备的版本控制工具,以下是核心操作的详细说明及示例: 一、Git基础概念 仓库(Repository):存储代码的目录,包含所有版本历史。提交(Commit)…...
