面试+算法:罗马数字及Excel列名与数字互相转换

news2024/11/20 6:27:20

概述

算法是一个程序员的核心竞争力,也是面试最重要的考查环节。

试题

判断一个罗马数字是否有效

罗马数字包含七种字符:I,V,X,L,C,D和M,如下

字符数值
I1
V5
X10
L50
C100
D500
M1000

规则:

  1. 不能出现连续相同的4个及以上字符,但是IIII=4MMMM=4000除外;
  2. 不能存在特定组合,如DD,因为DD=M;
  3. 小数字只能在大数字的右边,表示这些数字相加得到的数;
  4. 但存在违反上述规则的特例:小数字在大数字的左边,表示大数减小数得到的数,只适用于以下六种情况:
    • I 可以放在 V(5) 和 X (10) 的左边,表示4和9;
    • X 可以放在 L(50) 和 C (100) 的左边,表示40和90
    • C 可以放在 D(500) 和 M (1000) 的左边,表示400和900

在线阿拉伯数字和罗马数字互相转换
https://www.onlineconversion.com/roman_numerals_advanced.htm

The input must be in the range of 1 - 4999, or I to MMMMCMXCIX.

罗马数字最大只能表示到4999。

比如输入:LVIIID,系统提示:LVIIID is not a valid input
在这里插入图片描述
https://www.luomashuzi.com/
在这里插入图片描述
使用正则表达式来判断一个给定的字符串是不是合法的罗马数字字符串:

public static boolean isRoman(String s) {
    return !s.isEmpty()
            && s.matches("M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})");
}

阿拉伯数字转罗马数字

将一个阿拉伯数字转换成罗马数字,显然需要考虑罗马数字的有效性问题。

public static String convertToRoman(int num) {
    if (num >= 5000) {
        return "";
    }
    String result = "";
    if (num >= 1000) {
        result = repeat("M", (int) Math.floor(1.0 * num / 1000));
        num %= 1000;
    }
    if (num >= 100) {
        result += geneBase((int) Math.floor(1.0 * num / 100), new String[]{"C", "D", "M"});
        num %= 100;
    }
    if (num >= 10) {
        result += geneBase((int) Math.floor(1.0 * num / 10), new String[]{"X", "L", "C"});
        num %= 10;
    }
    if (num >= 1) {
        result += geneBase((int) Math.floor(num), new String[]{"I", "V", "X"});
    }
    return result;
}

private static String geneBase(int num, String[] arr) {
    String result = "";
    if (num >= 1 && num <= 3) {
        result = repeat(arr[0], num);
    }
    if (num == 4) {
        result = arr[0] + "" + arr[1];
    }
    if (num >= 5 && num <= 8) {
        result = arr[1] + "" + repeat(arr[0], num - 5);
    }
    if (num == 9) {
        result = arr[0] + "" + arr[2];
    }
    return result;
}

/**
 * 重复多次
 */
private static String repeat(String str, int count) {
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < count; i++) {
        result.append(str);
    }
    return result.toString();
}

罗马数字转数字

给定一个罗马数字表示的字符串,将其转换成数字,即阿拉伯数字。

注:可以假定给定的罗马数字字符串是合法的。

public static 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;
}

数字转Excel列

给定一个数字将其转换成Excel里面的列。

背景知识:

  • Excel的行是用阿拉伯数字表示,列则用大写英文字母表示;
  • Excel 2003最多有65536行,256列;
  • Excel 2007、2010最多有1048576行,16384列;
  • 列用A到Z表示,第27列是AA,第53列是BA,第26 + 26 * 26 + 1列是AAA,以此类推……最后一列是XFD
    在这里插入图片描述
public static String convertToTitle(int n) {
    if (n <= 0) {
        return "";
    }
    StringBuilder sb = new StringBuilder();
    while (n > 0) {
        n--;
        sb.append((char) (n % 26 + 'A'));
        n = n / 26;
    }
    return sb.reverse().toString();
}

Excel列转数字

public static int excelColumnNameToNumber(String columnName) {
    int sum = 0;
    if (columnName.equals("")) {
        return sum;
    }
    for (int i = 0; i < columnName.length(); i++) {
        sum *= 26;
        sum += (columnName.charAt(i) - 'A' + 1);
    }
    return sum;
}

参考

  • 检查罗马数字的有效性

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

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

相关文章

libgdx导入blender模型

具体就是参考 官网 https://libgdx.com/wiki/graphics/3d/importing-blender-models-in-libgdx blender 教程可以看八个案例教程带你从0到1入门blender【已完结】 这里贴一下过程图。 1.初始环境搭建略过。 2.打开blender 选中摄像机和灯光&#xff0c;右键进行删除。 3.选中…

ES 7.7.0 数据迁移

本文使用 elasticdump 做数据迁移&#xff0c;支持在线和离线俩种方式&#xff0c;适用于数据量比较小的情况。 1、Node 安装 由于elasticdump 依赖于 node&#xff0c;首先需要安装下node。 1.1、 Linux 安装 $ wget https://nodejs.org/dist/v10.15.0/node-v10.15.0-linu…

[数据结构]:10-二叉排序树(无头结点)(C语言实现)

目录 前言 已完成内容 二叉排序树实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-BinarySearchTreeCommon.cpp 04-BinarySearchTreeFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言…

基于支持向量机SVM的房价预测,基于支持向量机SVM的回归分析

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 SVM应用实例,基于SVM的房价预测 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;…

【算法题】1958. 检查操作是否合法

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一个下标从 0 开始的 8 x 8 网…

Vue响应式原理————Object.defineProperty()和proxy的用法分享

Vue框架一个比较核心的功能就是我们的数据是响应式的&#xff0c;这样我们在修改数据的时候&#xff0c;页面会自动帮我们更新&#xff0c;那么想要实现这个功能就要实现对一个数据的劫持&#xff0c;即在取值和设置值的同时我们能够检测到即数据劫持。vue2响应式的实现原理所依…

用原生js手写分页功能

分页功能如下&#xff1a; 数据分页显示&#xff0c;每页显示若干条数据&#xff0c;默认当前页码为第一页。例如&#xff1a;每页5条数据&#xff0c;则第一页显示 1-5 条&#xff0c;第二页显示 6-10 条&#xff0c;依此类推。当页码为第一页时&#xff0c;上一页为禁用状态…

IronPDF for .NET 2023.2.4 Crack

适用于 .NET 2023.2.4 的 IronPDF 添加对增量 PDF 保存的支持。 2023 年 3 月 2 日 - 10:23新版本 特征 添加了对 IronPdfEngine Docker 的支持。 添加了对增量 PDF 保存的支持。 重新设计了 PDF 签名和签名。 删除了 iTextSharp 依赖项。 在文本页眉/页脚中添加了 DrawDivider…

laravel8多模块、多应用和多应用路由

1、安装多应用模块 composer require nwidart/laravel-modules2、执行命令&#xff0c;config文件夹下生成一个modules.php配置文件 php artisan vendor:publish --provider"Nwidart\Modules\LaravelModulesServiceProvider"3、修改config文件夹下的modules.php&am…

python爬虫学习之路

【2023.3.3】一、爬虫概念 通过编写程序&#xff0c;模拟浏览器上网&#xff0c;然后让其去互联网上抓取数据的过程。 价值&#xff1a; 抓取互联网上的数据&#xff0c;为我所用&#xff0c;有了大量的数据&#xff0c;就如同有了一个数据银行一样&#xff0c;下一步做的就是如…

程序员怎么写出亮眼的简历?

要随时与正能量的人保持同行&#xff0c;因为他的心一直在靠近远方 什么是简历 我们先看下百度百科对于简历的描述&#xff1a; 可以看出&#xff0c;简历是受法律规定&#xff0c;因为简历本身的信息真实性较高&#xff0c;所以简历一直是早期被市场上进行数据交易的重要载…

windows 下 python 和repo 下载安装环境变量配置

repo 安装成功&#xff0c;但是下载代码 repo init的时候出错 不知道是不是repo windows版本有问题 python 最好下载2.6-2.7版本的 Python Releases for Windows | Python.org 不然下载代码会有问题&#xff0c;下不了&#xff0c;会提示安装2.6-2.7版本的 Windows下成功安…

人机界面艺术设计

人机界面艺术设计 2.1人机界面艺术设计思路 人们经常有意通过某种工具或创造来解决难题&#xff0c;然而这并不意味着人们乐于接受别人或其他事情&#xff0c;他们很难提出问题。在用户使用网页或软件的时候&#xff0c;他们有明确的目标&#xff0c;他们利用电脑来帮助自己达…

Hbase RegionServer的核心模块

RegionServer是HBase系统中最核心的组件&#xff0c;主要负责用户数据写入、读取等基础操作。RegionServer组件实际上是一个综合体系&#xff0c;包含多个各司其职的核心模块&#xff1a;HLog、MemStore、HFile以及BlockCache。 一、RegionServer内部结构 RegionServer是HBas…

Altium Designer PCB孤岛铜的去除方法教程

孤岛铜&#xff0c;也叫死铜&#xff0c;是指在PCB中孤立无连接的铜箔&#xff0c;一般都是在敷铜的时候产生&#xff0c;不利于生产。解决的办法比较简单&#xff0c;可以手工连线将其与同网络的铜箔相连&#xff0c;也可以通过打过孔的方式将其与同网络的铜箔相连。无法解决的…

Biomod2 (下):物种分布模型建模

这里写目录标题1.给出一个线性回归模型并求出因子贡献度2.biomod22.1 pseudo-absences:伪不存在点&#xff08;PA&#xff09;2.1.1 random2.2.2 disk2.2.3 user.defined method3.使用网格划分区域3.1 计算质心4. 完整案例1.给出一个线性回归模型并求出因子贡献度 ##---------…

【游戏逆向】FPS游戏玩家对象数据分析

玩家健康值 查找玩家健康值,玩家健康值是100,但是我们并不知道数值类型,我们可以使用精确搜索方式搜索100-所有类型 CE搜索 结果很多,我们可以使用手雷来减少血量 我们会得到两个结果 我们可以去尝试改变数值,最终发现一个是我们的客户端健康值,一个是服务器健康值,…

Java——N皇后问题

题目链接 leetcode在线oj题——N皇后 题目描述 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff…

RocketMQ Broker消息处理流程剩余源码解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年3月4日 &#x1…

CCNP350-401学习笔记(补充题目1-100)

1、wireless client to roam --->> wireless client 2、Cisco aWIPS policies on the WLC 3、 import json -->> while true -->>except -->> File open -->>File.close() -->> File.open() 4、 login console group radius 5、undesir…