面试+算法:罗马数字及Excel列名与数字互相转换
创始人
2024-05-28 20:08:21
0

概述

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

试题

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

罗马数字包含七种字符: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;
}

参考

  • 检查罗马数字的有效性

相关内容

热门资讯

中信建投:建议不拘泥于“人形”... 中信建投研报称,人形机器人半马得到广泛关注,赛事结束后引发了人形机器人的表现是“翻车”还是行业进步的...
中信建投:稀土供需格局向好 关... 人民财讯4月21日电,中信建投研报称,美国本土稀土公司MP Materials确认,由于卷入贸易冲突...
海南:出台12条措施加强人大代...   本报讯(记者杨帆)近日,海南省检察院研究制定《关于进一步加强和改进全省检察机关与省人大代表联络工...
贵州:务实举措优化法治化营商环...   本报讯(记者丁艳红 通讯员范嗣刚 刘有书)为推动违规异地执法和趋利性执法司法专项监督深入开展,贵...
全长约14.9公里!南昌这段路... 近日,南昌市自然资源和规划局公示了《南昌市高新大道快速化改造工程道路交通详细规划(优化)》,标志着这...
荣昌“停车免费”,能否一视同仁   4月16日,在重庆市荣昌区网络经济暨卤鹅产业发展金点子征集座谈会上,区委书记高洪波提出推行“停车...
知名QFII持仓曝光,中东土豪... 据数据宝,整体上来看,披露2024年年报以及2025年一季报的个股中,截至2025年一季度末,QFI...
金丹科技2024年归母净利润同... 每经记者 王佳飞    每经编辑 文多     4月20日,金丹科技(SZ3008...
强强牵手,济青双圈联动“圈”出...   4月18日,济南青岛都市圈联动发展协同开放会议在济南召开。当前,济青高铁已“公交化”开行,两大都...
华天科技:市值管理重在信息披露... 投资者提问:董秘你好,公司提出市值管理,请问怎么个管理法?具体措施是什么?是让市值往下走?还是往上走...
2025年我省马拉松联赛共设2...   记者 刘伟 滨州报道         近日,2025年全省体育赛事工作会议在滨州召开。今年共收到...
鲸鱼搁浅:失语的隐喻   □丁瑜  电影《不说话的爱》根据沙漠导演的同名短片改编。短片通过平视的视听策略,将聋人群体的主体...
旋风访华,“皮衣教主”为何换上... 转自:北京日报客户端近日,英伟达CEO黄仁勋突然现身北京,而这次访华距离上次仅过了三个月。与以往不同...
多家银行调低存款利率 4月以来,银行存款利率纷纷下调,多地城商行、村镇银行下调中长期定存利率,降幅较大。在业内人士看来,多...
全国大学生职业规划大赛 哈工大...   本报讯(张又元 记者 纪天伟)4月16日至19日,第二届全国大学生职业规划大赛总决赛、风采展示及...
安徽加快构建“政产学研金服用”... 转自:安徽新闻网本网讯(记者 王弘毅)近日,省政府办公厅印发《安徽省加快构建“政产学研金服用”融合发...
审批与招标并联推进让项目加快落... 转自:河北新闻网河北日报讯(记者邢云)近日,衡水市桃城区数据和政务服务局公共资源交易中心评标室内,该...
湖城仁皇山区域动态公交下月开通... 转自:湖州日报  记者  董梁  本报讯  记者近日从市交通集团所属湖州公交集团获悉,为满足市民多元...
文化传承发展百人谈(79)丨中... (点击图片进入报道专题)人物简介韩建业,中国人民大学历史学院考古文博系教授、博士研究生导师,吴玉章学...
承压而上,牢牢稳住就业基本盘 新华社记者 就业,一头连着宏观大势,一头连着万家灯火。 记者近日在多地采访看到,面对复杂局面,各地...