阿拉伯数转中文与英文[找到规律,抽象问题,转换成代码]

news2025/1/14 1:17:22

阿拉伯数转中文与英文

  • 前言
  • 一、阿拉伯数字转换
    • 1、阿拉伯数字转中文
      • a、案例
      • b、解决方案
    • 2、阿拉伯数转英文
      • a、案例
      • b、解决方案
  • 总结
  • 参考文献

前言

如果思考算法的解法方案是一种模拟,那么这一般不是个好的解决方案。对于一个复杂的问题,挖掘其中的规律,把问题抽象处理统一解决,这样代码才会简洁清晰。

一、阿拉伯数字转换

1、阿拉伯数字转中文

a、案例

在这里插入图片描述

b、解决方案

将数字分解成三部分,亿 & 万 & 无单位,通过for循环分片出来即可,三部分处理方式是一样的,唯一不同的就是最后的单位添加。
而对于每一部分,具体的处理方式一样,分成个十百千四个级别,所有用一个函数统一处理即可。
注:需要注意到细节,
1.只有一种前导为零的情况要特殊处理;
2.每部分末尾不能为0
3.多个零只能写一个
4.有零的时候表不表达出来要根据前面是否为0

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return string字符串
     */
    public String num2cn (int n) {
        // 唯一一个前导可以为零!
        if (n == 0) return "零";
        // 统一为正数处理。
        boolean isNeg = n < 0;
        n = Math.abs(n);
        // 把规律抽象出来,
        // 将这个数字分成三部分,亿 & 万 & 无单位
        // 每一部分,末尾是不能以0结尾的;多个零只能用一个零表示。
        StringBuilder sb = new StringBuilder();
        for (int i = 2, unit = (int)1e8; i >= 0; i--, unit /= 1e4) {
            int part = n / unit;
            if (part != 0) {
                sb.append(toChinese(part)).append(units[i]);
                n %= unit;
            }
        }
        
        String rs = sb.toString();
        // 特殊情况,一十开头变成十。
        if ("一十".equals(rs.substring(0, 2))) rs = rs.substring(1);
        // 前缀是否为负,要加上。
        if (isNeg) rs = "负" + rs;
        return rs;
    }
    boolean preIsZero = true;// 只要前面有非零数,那么零就需要表达出来。
    public String toChinese(int num) {
        StringBuilder sb = new StringBuilder();
        // 分成四个部分处理,千 & 百 & 十 & 个位
        for (int i = 3, unit = (int)1e3; i >= 0; i--, unit /= 10) {
            int cur = num / unit;

            if (cur != 0) {
                sb.append(chinese[cur]).append(base[i]);
                preIsZero = false;
            } else if (!preIsZero) {
                sb.append(chinese[cur]);
                preIsZero = true;
            }
            num %= unit;
        }
        // 每一部分,都不能以零结尾。
        if ("零".equals(sb.substring(sb.length() - 1))) {
            // 如果为零,还得更改preIsZero,设置为false,毕竟把零给去了。
            preIsZero = false;
            sb.deleteCharAt(sb.length() - 1);
        }
        return sb.toString();
    }

    static String[] chinese =
        new String[] {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
    static String[] base = new String[] {"", "十", "百", "千"};
    static String[] units = new String[] {"", "万", "亿"};
}

2、阿拉伯数转英文

a、案例

在这里插入图片描述

b、解决方案

同样采用抽象统一的思想,规律也很容易发现,每三个数分为一趴,单位分别为Billion Million Thousand 无单位。
注:和中文不同的时,十几和其他两位数的处理方式。

class Solution {
    // num的范围从0-20亿。
    // 数字转英文,不同于中文,
    // 右到左每三位一组划分,Millon,Thousand,结尾,3位用一个函数获取转换后的结果,当作最低三位。
    public String numberToWords(int num) {
        if(num == 0) return "Zero";
        StringBuilder sb = new StringBuilder();
        for(int i = 3,unit = (int)1e9;i >= 0;i--,unit /= (int)1e3){
            int cur = num / unit;
            if(cur != 0){
                sb.append(toEnglish(cur)).append(thousands[i]).append(' ');
                num %= unit;
            }
        }
        return sb.toString().trim();
    }
    public String toEnglish(int num){
        StringBuilder sb = new StringBuilder();

        int i = num / 100;
        if(i != 0) sb.append(singles[i]).append(" Hundred ");
        num %= 100;
        i = num / 10;
        if(i > 1) {
            sb.append(tens[i]).append(' ');
            num %= 10;
        }
        if(num == 0) return sb.toString();
        if(num < 10) sb.append(singles[num]).append(' ');
        else sb.append(teens[num % 10]).append(' ');
        
        return sb.toString();
    }
    String[] singles = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};
    String[] teens = {"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
    String[] tens = {"", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
    String[] thousands = {"", "Thousand", "Million", "Billion"};
}

总结

1)模拟不是算法,算法需要抽象问题,让问题有统一简洁的处理方式,抓住规律才能让问题简单起来。
2)善用数据结构,善用空间存储,降低时间复杂度,比如常用的数组,是一个很好用的数组hash。

参考文献

[1] LeetCode 阿拉伯数转中文
[2] LeetCode 阿拉伯数转英文

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

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

相关文章

制造业管理系统如何帮助企业快速应对品质异常问题?

在企业生产制造过程中&#xff0c;成品发生品质异常问题是不可避免的。当成品出现问题&#xff0c;为了有效防范批量品质事故&#xff0c;品管需要快速判断可能是哪个材料引起的&#xff0c;需要知道这批成品是谁做的&#xff0c;什么时候做的&#xff0c;提供材料的分别是哪个…

MySQL基础篇语句--DDL语句

SQL简介 当面对一个陌生的数据库时,通常需要一种方式与它交互&#xff0c;以完成用户所需要的各种工作&#xff0c;这个时候&#xff0c;就要用到SQL语言了。 SQL是Structure Query Language(结构化查询语言)的缩写&#xff0c;它是使用关系模型的数据库应用语言&#xff0c;由…

传统推荐模型(一)协同过滤算法_UserCF和ItemCF

传统推荐模型&#xff08;一&#xff09;协同过滤算法_UserCF 1、UserCF 协同过滤就是协同大家的反馈、评价和意见一起对海量的信息进行过滤&#xff0c;从中筛选出目标用户可能感兴趣的信息的推荐过程。 物品1物品2物品3物品4物品5用户131233用户243435用户333154用户41552…

OneNote(或印象笔记)迁移到Joplin的方法

2023年1月10日实操记录简介背景是必须卸载OneNote&#xff0c;所以要迁移笔记。告别了用了23年的Outlook &#xff0c;和10年左右的OneNote&#xff0c;小伤感&#xff0c;自此一别 就不能用练就的VBA技能在Excel和Access中处理数据了。。。基本前提Joplin支持.enex格式文件的导…

总结述职报告撰写方法,报告目的、对象、内容、技巧等

导语 又到年末时&#xff0c;述职报告再一次席卷而来。这篇文章将带来干货满满的述职报告撰写方法&#xff0c;包括述职目的、对象、内容、技巧等多个方面。 一、述职目的 有多少人认为&#xff0c;述职只是走个形式&#xff0c;走个过场的&#xff1f; 如果你这样认为&#x…

2023济南制药机械展|中国(济南)国际制药机械与包装技术展览会

2023中国&#xff08;济南&#xff09;国际制药机械与包装技术展览会将于2023年3月30-4月1日在山东国际会展中心&#xff08;济南市槐荫区日照路1号&#xff09;同期举办&#xff1a;2023第11届国际生物发酵展2023国际生化仪器与实验室装备展2023国际生物技术与生物制药展支持单…

以太网链路聚合与交换机堆叠、集群

网络的可靠性 网络的可靠性指当设备或者链路出现单点或者多点故障时保证网络服务不间断的能力网络的可靠性可以从单板、设备、链路多个层面实现 一般重要的核心设备都有一定的冗余 s12700E-8机框正面结构 框式交换机由机框、电源模块、风扇模块、主控板、交换网板&#xff…

CSS入门六、常用技巧

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

人工智能-linux高级操作命令

目录1、 重定向命令2、查看文件内容命令3、链接命令3.1 软链接4、查找文件内容命令5、查找文件命令6、压缩和解压缩文件7、文件权限命名8、获取管理员权限的相关命令9、远程登陆、远程拷贝10、软件安装与卸载11、vim介绍1、 重定向命令 将目录下的文件名全部写入新文件 touch …

场景编程集锦 - BMI指数与健身达人

1. 场景描述 BMI指数&#xff08;身体质量指数&#xff0c;英文Body Mass Index&#xff09;是用体重公斤数除以身高米数的平方得出的数字&#xff0c;是目前国际上通用的衡量人体胖瘦程度以及是否健康的一个标准。“身体质量指数”这个概念&#xff0c;是由19世纪中期的比利时…

马蹄集 宽度与对齐

宽度与对齐 难度&#xff1a;白银 时间限制&#xff1a;1秒巴占用内存&#xff1a;64M 输出455、-123、987654&#xff0c;宽度为5&#xff0c;分别左对齐和右对齐 格式 输入格式&#xff1a;无 输出格式&#xff1a;输出为整型&#xff0c;空格分隔。每个数的输出占一行 #inc…

[34]. 在排序数组中查找元素的第一个和最后一个位置

在排序数组中查找元素的第一个和最后一个位置题目算法设计&#xff1a;二分查找题目 算法设计&#xff1a;二分查找 进行两次二分查找&#xff08;定制版本&#xff09;&#xff0c;第一次先查找【第一个大于等于target的数】&#xff0c;第二次再查找【第一个大于target的数】…

Mac安装python3并配置环境变量

文章目录homebrew 安装 python3配置 python3 环境变量homebrew 安装 python3 可以用 homebrew 安装&#xff0c;也可以官网下载安装&#xff0c;我这里选择使用 homebrew 安装&#xff0c;没有装 homebrew 的小伙伴请自行百度 brew install python3我们执行下 python3 发现可…

Centos7安装高版本zshzim框架安装powerlevel10k

1. 安装高版本zsh 1.1 卸载低版本zsh sudo yum remove zsh -y1.2 下载源码 源码&#xff1a;https://zsh.sourceforge.io/Arc/source.html # 下载 wget https://jaist.dl.sourceforge.net/project/zsh/zsh/5.9/ # 解压 $ tar xvf zsh-5.9.tar.xz1.3 编译安装 yum install …

新应用——养老院管理应用,信息化的多功能管理应用

养老院管理系统专门为医养结合的养老机构量身打造的信息化管理系统&#xff0c;还适用于社区医院&#xff0c;包含诊断、病历、财务、物资、照护记录、处方等功能点。此应用分为经营管理、长者管理、物资库存、财会综合等四个大模块&#xff0c;全方面打造适用于养老院&#xf…

精准招聘!一图了解2023牛客校招专场

当「简历海投」成为当代大学生一种「硬核求职」的方式&#xff0c;如何精准地找到与招聘目标相匹配的专业人才成为HR校园招聘工作中的一大难点。为了帮助企业解决这些难题&#xff0c;牛客为企业推出了「牛客招聘专场」助力企业做好雇主品牌传播&#xff0c;提升收到的简历质量…

自动驾驶道路曲率计算

自动驾驶系列 车道曲率和中心点偏离距离计算 文章目录自动驾驶系列目标一、曲率的介绍圆的曲率曲线的曲率二、实现1.计算曲率半径的方法&#xff0c;代码实现如下&#xff1a;总结目标 知道车道曲率计算的方法 知道计算中心点偏离距离的计算 一、曲率的介绍 曲线的曲率就是针…

CSS入门五、定位

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

Revit出图问题:打印机中新建纸张尺寸?批量导出图纸?

一、Revit中在打印机中新建纸张尺寸 Revit导出PDF图纸&#xff0c;如何在打印机中新建纸张的尺寸&#xff1f; 在导出PDF的时候&#xff0c;我们需要将图纸放在合适的纸张页面上&#xff0c;而这个时候系统又没有提供所需的页面尺寸&#xff0c;如图1所示。 这种情况下我们该如…

数据结构学习笔记——二叉排序树

目录一、二叉排序树的定义二、二叉排序树的插入和构造三、二叉排序树的查找四、二叉排序树的平均查找长度五、二叉排序树的删除六、二叉排序树和二分查找对比二叉排序树的查找过程与折半查找&#xff08;二分查找&#xff09;相似&#xff0c;即折半查找的判定树就是一棵二叉排…