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

解题思路

  1. 首先判断分子是否为0,如果为0则直接返回"0"。
  2. 创建一个StringBuilder对象str,用于存储结果字符串。
  3. 判断分子和分母的符号是否不同,如果不同则在结果字符串前加上负号。
  4. 将分子和分母转换为绝对值,并计算商,将其添加到结果字符串中。
  5. 计算余数remainter。
  6. 如果余数为0,说明已经完成了转换,直接返回结果字符串。
  7. 在结果字符串后加上一个小数点。
  8. 创建一个HashMap对象map,用于记录已经出现过的余数及其位置。
  9. 当余数不为0时,执行以下操作: a. 检查map中是否已经存在当前的余数,如果存在,说明出现了循环小数,将循环部分括在括号内,并插入到正确的位置。 b. 将当前的余数和其在结果字符串中的位置添加到map中。 c. 将余数乘以10,得到下一位小数。 d. 将下一位小数添加到结果字符串中。 e. 更新余数。
  10. 返回结果字符串。

代码思路

  1. 首先检查分子是否为0,如果是,则直接返回"0"。

     // 如果分子为0,直接返回"0"if (numerator == 0)return "0";
    
  2. 创建一个StringBuilder对象str,用于构建结果字符串。

  3. 检查分子和分母的符号是否不同,如果不同,则在结果字符串前加上负号。

     // 如果分子和分母的符号不同,需要在结果字符串前加上负号if (numerator < 0 ^ denominator < 0)str.append('-');
    
  4. 计算分子和分母的绝对值,并将它们转换为长整型dividend和divisor。

      // 计算分子和分母的绝对值,并将它们转换为长整型long dividend = Math.abs(Long.valueOf(numerator));long divisor = Math.abs(Long.valueOf(denominator));
    
  5. 将商添加到结果字符串中。

     // 将商添加到结果字符串中str.append(String.valueOf(dividend / divisor));
    
  6. 计算余数remainter。

    // 计算余数long remainter = dividend % divisor;
    
  7. 如果余数为0,说明已经完成了转换,直接返回结果字符串。

     // 如果余数为0,说明已经完成了转换,直接返回结果字符串if (remainter == 0)return str.toString();
    
  8. 在结果字符串后加上一个小数点。

    // 在结果字符串后加上一个小数点str.append('.');
    
  9. 创建一个哈希表map,用于记录已经出现过的余数。

     // 创建一个哈希表,用于记录已经出现过的余数Map<Long, Integer> map = new HashMap<>();
    
  10. 当余数不为0时,继续进行转换: a. 如果哈希表中已经存在当前的余数,说明出现了循环节,需要插入括号。

     // 当余数不为0时,继续进行转换while (remainter != 0) {// 如果哈希表中已经存在当前的余数,说明出现了循环节,需要插入括号if (map.containsKey(remainter)) {str.insert(map.get(remainter), "(");str.append(")");break;}
    
  11. b. 将当前的余数和它在结果字符串中的位置添加到哈希表中。

       // 将当前的余数和它在结果字符串中的位置添加到哈希表中map.put(remainter, str.length());
    
  12. c. 将余数乘以10,得到下一位小数。

     // 将余数乘以10,得到下一位小数remainter *= 10;
    
  13. d. 将下一位小数添加到结果字符串中。

      // 将下一位小数添加到结果字符串中str.append(String.valueOf(remainter / divisor));
    
  14. e. 更新余数。

    // 更新余数remainter %= divisor;
    
  15. 返回最终的结果字符串。

   // 返回最终的结果字符串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,将其转为罗马数字。解题思路如下:

  1. 首先判断n是否大于等于20,因为只有当n大于等于20时,才能将数字拆分为两部分,即十位和个位。如果n小于20,那么直接返回n本身作为罗马数字即可。
  2. 如果n大于等于20,接下来需要将n除以10,得到商和余数。这里的商表示十位数,余数表示个位数。
  3. 将商作为罗马数字的十位数,余数作为罗马数字的个位数,然后将这两个部分组合起来,得到最终的罗马数字。

例如,给定整数n=56,其罗马数字为XII。

代码思路

  1. 初始化一个变量n为0,用于存储转换后的整数值。

  2. 使用for循环遍历输入的字符串s。

      // 使用for循环遍历字符串s中的每个字符for (int i = 0; i < s.length();) 
    
  3. 在循环中,首先获取当前字符c。

     // 获取当前字符cchar c = s.charAt(i);
    
  4. 根据字符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++;}}
      
  5. 循环结束后,返回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…, 由于返回类型是整数,小数部分将被舍去。

解题思路

  1. 初始化左边界left为0,右边界right为46340。这里选择46340是因为题目要求返回结果为整数,而46340的平方是2000000000,大于题目给定的最大整数x。
  2. 当左边界小于右边界时,执行循环。在循环中,首先计算中间值mid,然后根据mid的平方与x的大小关系,更新左边界或右边界。
  3. 如果mid的平方小于x,说明平方根在mid的右侧,将左边界更新为mid + 1。
  4. 如果mid的平方大于x,说明平方根在mid的左侧。此时需要判断(mid - 1)的平方是否小于等于x。如果是,说明平方根就是mid - 1,直接返回mid - 1;否则,将右边界更新为mid - 1。
  5. 如果mid的平方等于x,说明找到了平方根,直接返回mid。
  6. 如果循环结束后,左边界的平方大于x,说明平方根在左边界的左侧,将左边界减1后返回。
  7. 否则,直接返回左边界。

代码思路

  1. 初始化左边界left为0,右边界right为46340(因为题目要求返回的结果不超过32位有符号整数的范围)。

     // 初始化左边界left为0,右边界right为46340int left = 0, right = 46340;
    
  2. 进入循环,当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;}
    
  3. 当循环结束后,如果left的平方大于x,说明平方根在left的左侧,将left减1后返回。

  4. 如果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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/143081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux奇遇记】我和Linux的初次相遇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:Linux奇遇记系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 前端和后端的介绍 1.前端 2.后端 3.前后端区别 Linux在前后端开发中的角色 如何学习Linux 去进行程序开发 Linux的常见根目…

爆款元服务!教你如何设计高使用率卡片

元服务的概念相信大家已经在 HDC 2023 上有了很详细的了解&#xff0c;更轻便的开发方式&#xff0c;让开发者跃跃欲试。目前也已经有很多开发者开发出了一些爆款元服务&#xff0c;那么如何让你的元服务拥有更高的传播范围、更高的用户使用率和更多的用户触点呢&#xff1f;设…

Git取消git add命令

三种方法来取消git add命令-git-PHP中文网 亲测有效。

MySQL 索引事务

MySQL 索引&事务 文章目录 MySQL 索引&事务1. 索引1.1 概念1.2 作用1.3 使用场景1.4 使用 2. 事务2.1 为什么使用事务2.2 事务概念2.3 事务的特性2.4 使用 1. 索引 1.1 概念 索引(index)是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的…

学好Python-新手小白如何做?

新手小白如何学好Python?有哪些参考方法吗?这是一个老生常谈的话题了。今天为大家带来两位前辈的分享&#xff0c;他们给出了非常实用的方法和思路&#xff0c;希望对你有所帮助。 1、多练&#xff0c;两个字&#xff1a;多练 如果真的要说方法可以参考如下&#xff1a; ①…

排查线程阻塞问题

案例代码 package first;import java.util.concurrent.TimeUnit;public class DeadLock {private static volatile Object lock new Object();public static void main(String[] args) {new Thread(() -> {test1();}).start();new Thread(() -> {test2();}).start();}p…

Spring 推断构造方法

文章目录 内容总结实例化 内容总结 实例化 Spring 自行创建 Bean 的规则如下 默认使用无参构造方法, 只有一个有参时用有参, 有多个有参时报错多个有参, 且其中一个上有 Autowired 注解: 用有 Autowired 注解的那个, 且 Spring 自动注入参数值. 注意 Primary/Order/Ordered …

[量化投资-学习笔记015]Python+TDengine从零开始搭建量化分析平台-量化知识点汇总

之前的章节介绍了多个技术分析指标&#xff0c;以下进行一个简单的总结。 看过之前章节的同学就可以不用打开了。 技术指标 MAEMAMACDCCIATRKDJ MA 最基础的技术指标&#xff0c;对一段周期内的收盘价进行简单平均&#xff0c;是一切指标的基础。 def calc_ma(period,ma):ma_…

JAVA中Integer的拆箱与装箱

Integer 字符串与数值 的转换 String str"1000";int i1000;//int --> String//方式一 String s1i"";//int类型加上一个空字符串 返回就是字符串System.out.println(s1);//方式二String s2String.valueOf(i); //调用String的方法valueOf, 将int类型变…

centos下安装mysql8版本

1、如果服务器没有wget&#xff0c;先下载wget工具 sudo yum install wget 2、下载指定mysql版本的tar包 sudo wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.21-1.el7.x86_64.rpm-bundle.tar 3、解压tar包 sudo tar -xvf mysql-8.0.21-1.el7.x86_64.rpm…

《QT从基础到进阶·二十四》按钮组QButtonGroup,单选框QRadioButton和多选框QCheckBox

1、按钮组QButtonGroup 如果有多个单选按钮&#xff0c;可以统一放进一个按钮组。 图中有三个单选按钮放进了一个QGroupBox,并且设置了水平布局&#xff0c;现在要将这三个单选按钮放进一个按钮组&#xff0c;之前的想法是先把三个按钮加入按钮组&#xff0c;再把按钮组放进QG…

cesium api放大缩小地图

方法缩小地图封装api <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Cesium Zoom API</title&…

MATLAB中uiresume函数用法

目录 语法 说明 示例 按下按钮后恢复执行 使用函数调用恢复执行 uiresume函数的功能是恢复暂停程序的执行。 语法 uiresume uiresume(f) 说明 uiresume 恢复与当前图窗 (gcf) 关联的对应 uiwait 调用暂停的程序执行。 uiresume(f) 恢复与图窗 f 关联的对应 uiwait 调用…

开发企业微信群机器人,实现定时提醒

大家好&#xff0c;我是鱼皮&#xff0c;今天分享一个用程序解决生活工作问题的真实案例。 说来惭愧&#xff0c;事情是这样的&#xff0c;在我们公司&#xff0c;每天都要轮流安排一名员工&#xff08;当然也包括我&#xff09;去楼层中间一个很牛的饮水机那里接水。但由于大…

MySQL安装配置与使用教程(2023.11.13 MySQL8.0.35)

CONTENTS 1. MySQL的安装与配置2. MySQL常用操作教程 1. MySQL的安装与配置 MySQL Windows Installer 下载地址&#xff1a;MySQL Installer。 我们下载最新版本&#xff08;目前是8.0.35&#xff09;的安装包&#xff0c;注意要选择更大的那个&#xff0c;名字为 mysql-inst…

【杂谈】体验AI帮助编写代码,有提升效率,AI本身提升空间也很大

体验AI帮助编写代码 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定…

租用服务器带宽类型应用

服务器带宽类型多样&#xff0c;以满足不同行业的需求。本文将介绍香港常见的服务器带宽类型及其应用领域。 1. 共享带宽 共享带宽是指多个用户共同使用同一台服务器的带宽资源。这种带宽类型适用于小型企业或个人网站&#xff0c;因为其成本较低。由于多个用户共享带宽资源&…

Java的XWPFTemplate word生成列表

Java的XWPFTemplate工具类导出word.docx的使用_xwpftemplate 语法_youmdt的博客-CSDN博客 如果是表格的列表参考上面这篇文章即可&#xff0c;比较复杂的列表遍历暂时还没找到方法&#xff0c;只能手动创建表格了 上面是模板&#xff0c;非常简单&#xff0c;以为我们是要自己创…

HTTP 常见的请求头

面试官&#xff1a;说说 HTTP 常见的请求头有哪些? 作用&#xff1f; 一、是什么 HTTP头字段&#xff08;HTTP header fields&#xff09;,是指在超文本传输协议&#xff08;HTTP&#xff09;的请求和响应消息中的消息头部分 它们定义了一个超文本传输协议事务中的操作参数 …

2023年最新的前端面试收集(2)

webpack熟悉吗&#xff1f;webpack打包流程是什么&#xff1f; webpack打包流程 解析配置文件&#xff1a; 读取并解析配置文件&#xff0c;并根据配置生成一个Compiler对象。读取入口文件&#xff1a;根据配置中的入口文件&#xff0c;读取这些文件及其依赖的模块&#xff0…