移除元素、分数到小数、整数转罗马数字

news/2024/7/8 3:04:16 标签: 算法, 数据结构, 排序算法

文章目录

    • 移除元素
    • 分数到小数
    • 整数转罗马数字

移除元素

给你一个数组 nums_ 和一个值 val,你需要 原地 移除所有数值等于 val _的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地修改输入数组
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以**「引用」**方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝 int len = removeElement(nums, val); 
// 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。 for (int i = 0; i < len; i++) {     print(nums[i]); }

示例 1:

输入:nums = [3,2,2,3], val = 3 
输出:2, nums = [2,2] 
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2 
输出:5, nums = [0,1,4,0,3] 
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100
class Solution {
    public int removeElement(int[] nums, int val) {
        int len = nums.length;
        for (int i = 0; i < len;) {
            if (nums[i] == val) {
                nums[i] = nums[len - 1];
                len--;
            } else {
                i++;
            }
        }
        return len;
    }
}

分数到小数

给定两个整数,分别表示分数的分子 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
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
class Solution {
    public String intToRoman(int num) {
        int f = 1000;
        int f2 = 1000;
        char[] sym = new char[] { 'M', 'D', 'C', 'L', 'X', 'V', 'I' };
        int fsi = 0;
        int[] s = new int[] { 2, 5 };
        int si = 0;
        int[] s2 = new int[] { 10, 1 };
        int si2 = 0;
        StringBuilder roman = new StringBuilder();
        while (num > 0) {
            int d = (int) Math.floor(num / f);
            int r = num % f;
            int d2 = (int) Math.floor(num / f2);
            int r2 = num % f2;
            if (d > 0) {
                if (d == 4) {
                    roman.append(sym[fsi]);
                    roman.append(sym[fsi - 1]);
                    num = r;
                } else if (d2 == 9) {
                    roman.append(sym[fsi + 1]);
                    roman.append(sym[fsi - 1]);
                    num = r2;
                } else {
                    for (int i = 0; i < d; i++) {
                        roman.append(sym[fsi]);
                    }
                    num = r;
                }
            }
            f = f / s[si];
            si++;
            si %= 2;
            f2 = f2 / s2[si2];
            si2++;
            si2 %= 2;
            fsi++;
        }
        return roman.toString();
    }
}

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位指出。
主页:共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃


http://www.niftyadmin.cn/n/14743.html

相关文章

VMware创建Linux虚拟机之(四)ZooKeeperHBase完全分布式安装

Hello&#xff0c;world&#xff01; &#x1f412;本篇博客使用到的工具有&#xff1a;VMware16 &#xff0c;Xftp7 若不熟悉操作命令&#xff0c;推荐使用带GUI页面的CentOS7虚拟机 我将使用带GUI页面的虚拟机演示 虚拟机&#xff08;Virtual Machine&#xff09; 指通过软…

Allegro如何设置走线禁布区操作指导

Allegro如何设置走线禁布区操作指导 Allegro可以任意设置走线的禁布区,以下图为例,需要在两个pin中间设置一个所有层都不能走线的禁布区域 具体操作如下 选择shape Add Rect命令 Option选择画在Route keepout-All层,type选择Static solid 鼠标移动到器件pad附近,右击会…

ws-discovery通过官网的例子来学习

ws-discovery该例子来自于ws-discovery.pdf&#xff0c;连接如下&#xff0c;表1和表2是对该例子的解释进行翻译&#xff0c;表3个是一个onvif的搜索响应 WS-Discovery (xmlsoap.org) ProbeMatches 消息 - Win32 apps | Microsoft Learn(microsoft的中文文档) (01) <s:Env…

《python 数据可视化基础》第三章 散点图 scatter

第三章 散点图 scatter 参考自官方文档&#xff1a;https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.scatter.html#matplotlib.axes.Axes.scatter matplotblib 绘制散点图常用参数&#xff1a; x, y&#xff1a;一个或者多个点的位置&#xff1b;s&#xff1…

数据结构-八大排序

八大排序一&#xff0c;直接插入排序二&#xff0c;希尔排序三&#xff0c;选择排序四&#xff0c;堆排序五&#xff0c;冒泡排序六&#xff0c;快速排序1&#xff0c;递归版本&#xff08;1&#xff09;hoare法&#xff08;2&#xff09;挖坑法&#xff08;3&#xff09;前后指…

数据挖掘 分类方法

分类的目的是学会一个分类函数或分类模型&#xff08;分类器&#xff09;&#xff0c;该模型能把数据库中的数据项映射到给定类别中的某一个类别。 分类可用于预测&#xff0c;常用的方法是回归&#xff0c;主要应用于医疗诊断&#xff0c;信用卡系统的信用分级、图像模式识别等…

Android -- 每日一问:两个 Fragment 之间如何进行通信 ?

知识点 先说一下 Fragment&#xff0c;中文可以叫片段&#xff0c;其实我们也可以把它理解成一个组件&#xff0c;它有自己的生命周期&#xff08;回调函数&#xff09;&#xff0c;可以组织UI和业务逻辑。但它不像 Android 的四大组件&#xff08;Activity, Service, Broadca…

小快轻准,5分钟自助上线,中小型制造企业数字化转型

中小企业作为国民经济的重要组成部分&#xff0c;占据我国企业数量的90%以上。 继《中小企业数字化赋能专项行动方案》发布后&#xff0c;工信部近日印发《中小企业数字化转型指南》&#xff0c;提出14条具体举措&#xff0c;为中小企业明确数字化转型路径。 地方政府也纷纷出…