一、罗马数字转整数
例如, 罗马数字 2 写做即为两个并列的 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。 给定一个罗马数字,将其转换成整数。 来源:力扣(LeetCode)
思路:
1. 将每个罗马数字的值对应的数字放入map集合
2. 遍历并取出每一个字符
3. 将取出字符的值与它下一个字符的值进行比较,若小于则当前字符的取负
4. 最后将值累加
public static int transform(String s) {
Map<Character, Integer> map = new HashMap<>(7);
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
int sum = 0;
int len = s.length();
for (int i = 0; i < len; i++) {
int value = map.get(s.charAt(i));
if (i < len - 1 && value < map.get(s.charAt(i + 1))) {
sum -= value;
} else {
sum += value;
}
}
return sum;
}
二、寻找公共前缀
编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs = ["flower","flow","flight"] 输出:"fl" 示例 2: 输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。 来源:力扣(LeetCode)
方法一:横向比较法
/**
* 横向扫描法
* 思路;
* 1. 获取第一个和第二个元素的公共前缀
* 2. 在拿获取到的前缀与下一个元素进行比较
*/
public static String solution1(String[] str) {
if (str.length == 0 || str == null) {
return "";
}
String prefix = str[0];
for (int i = 1; i < str.length; i++) {
prefix = isPrefix(prefix, str[i]);
}
return prefix;
}
public static String isPrefix(String str1, String str2) {
int min = Math.min(str1.length(), str2.length());
int index = 0;
while (index < min && str2.charAt(index) == str1.charAt(index)) {
index++;
}
return str1.substring(0, index);
}
方法二:纵向比较法
public static String solution2(String[] str){
if (str.length == 0 || str == null) {
return "";
};
for (int i = 0; i < str[0].length(); i++) {
char cha = str[0].charAt(i);
for (int j = 1; j < str.length; j++) {
if(str[j].charAt(i)!=cha || i == str[j].length()){
return str[0].substring(0,i);
}
}
}
return str[0];
}
方法三:二分查找法
思路:
1. 找出数组中最短字符串的长度
2. 取最短长度的中位数截取左半部分字符串
3. 将截取到的字符串与其他元素一一比较
1)如若不相同,则左移一个下标缩短截取字符串的长度直到为0
2)若相同,则下标增加一位延长字符串再进行比较直到low=high
/**
* 二分查找法
*/
public static String solution3(String[] str) {
if (str.length == 0 || str == null) {
return "";
}
;
int minLength = Integer.MAX_VALUE;
//找到数组中最短字符串的长度
for (int i = 0; i < str.length; i++) {
minLength = Math.min(str[i].length(), minLength);
}
int low = 0;
int high = minLength;
while (low < high) {
int mid = (high - low) / 2 + low;
if (isCommonPrefix(str, mid)) {
low = mid;
} else {
high = mid - 1;
}
}
return str[0].substring(0,low);
}
//判断是否是公共前缀
public static boolean isCommonPrefix(String[] str, int length) {
String str0 = str[0].substring(0, length);
for (int i = 1; i < str.length; i++) {
String str1 = str[i];
for (int j = 0; j < length; j++) {
if (str0.charAt(j) != str1.charAt(j)) {
return false;
}
}
}
return true;
}