HashMap&& LeetCode 13.罗马数组转换为整数
Posted 龚喜发财+1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap&& LeetCode 13.罗马数组转换为整数相关的知识,希望对你有一定的参考价值。
1.HashMap 类位于 java.util 包中,使用前需要引入它,语法格式如下:
import java.util.HashMap; // 引入 HashMap 类
2.HashMap<Integer,String> hashmap=new HashMap<>();
基本类型 引用类型
boolean Boolean
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
3.添加键值对put()方法
4.访问元素 get(key) 返回key对应的value
5.删除键值对 remove(key) 删除所有键值对 clear()
6.HashMap的元素数量 size()
7.HashMap迭代
可以使用 for-each 来迭代 HashMap 中的元素。如果你只想获取 key,可以使用 keySet() 方法,然后可以通过 get(key) 获取对应的 value,如果你只想获取 value,可以使用 values() 方法。
// 输出 key 和 value
for (Integer i : hashmap.keySet()) {
System.out.println("key: " + i + " value: " + Sites.get(i));
}
// 返回所有 value 值
for(String value: hashmap.values()) {
// 输出每一个value
System.out.print(value + ", ");
}
例题:罗马数字包含以下七种字符: 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 到 3999 的范围内。
题解1:当小值在大值的左边,则减小值,如 IV=5-1=4;
当小值在大值的右边,则加小值,如 VI=5+1=6;
由上可知,右值永远为正,因此最后一位必然为正。
即可以往后看多一位,对比当前位与后一位的大小关系,从而确定当前位是加还是减法。当没有下一位时,做加法即可。
public int romanToInt(String s) {
//将每个对应的数字对应起来
if(s==null||s.length()==0)
return 0;
HashMap<Character,Integer> hashMap = new HashMap<>();
hashMap.put('I', 1);
hashMap.put('V', 5);
hashMap.put('X', 10);
hashMap.put('L', 50);
hashMap.put('C', 100);
hashMap.put('D', 500);
hashMap.put('M', 1000);
char[] chars=s.toCharArray();
int i,result=0;
for(i=0;i<s.length()-1;i++){
if(hashMap.get(chars[i])>=hashMap.get(chars[i+1]))
result+=hashMap.get(chars[i]);
else{
result-=hashMap.get(chars[i]);
}
}
result+=hashMap.get(chars[s.length()-1]);
return result;
}
题解2:用占位符替代特殊罗马数字
public int romanToInt(String s) {
//先处理特殊情况,将特殊情况用占位符表示
//IV=A=4,IX=B=9,XL=E=40,XC=F=90,CD=J= 400 CM=K=900
s = s.replaceAll("IV", "A");
s = s.replaceAll("IX", "B");
s = s.replaceAll("XL", "E");
s = s.replaceAll("XC", "F");
s = s.replaceAll("CD", "J");
s = s.replaceAll("CM", "K");
Map<Character,Integer> keyMap=new HashMap<>();
keyMap.put('I',1);
keyMap.put('V',5);
keyMap.put('X',10);
keyMap.put('L',50);
keyMap.put('C',100);
keyMap.put('D',500);
keyMap.put('M',1000);
keyMap.put('A',4);
keyMap.put('B',9);
keyMap.put('E',40);
keyMap.put('F',90);
keyMap.put('J',400);
keyMap.put('K',900);
int result = 0;
char[] chars=s.toCharArray();
for (char c: chars) {
result+=keyMap.get(c);
}
return result;
}
以上是关于HashMap&& LeetCode 13.罗马数组转换为整数的主要内容,如果未能解决你的问题,请参考以下文章
HashMap的扩容机制---resize() &; 死循环的问题