整数转罗马数字
思路:
- 把各十百千位可能出现的情况都列出来,写成一个二维数组
- 找出该数的各十百千位,与数组中的罗马元素对应
cpp
const char* ch[4][10]={{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},//个位
{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},//十位
{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},//百位
{"", "M", "MM", "MMM"}};//千位
char* intToRoman(int num) {
char* str=(char*)malloc(sizeof(char)*16);
strcpy(str,ch[3][num/1000]);
strcat(str,ch[2][num/100%10]);
strcat(str,ch[1][num/10%10]);
strcat(str,ch[0][num%10]);
return str;
}
罗马数字转整数
思路:
- 将罗马数字出现的可能写成一个函数,方便后续的判断
- 从后往前遍历数组,当这个罗马字母转化成数字后的大小比前一个小,则说明该数字需要减掉,才能符合罗马数字的减法形式
cpp
class Solution {
public:
int change(char ch)
{
if(ch == 'I')
return 1;
else if(ch == 'V')
return 5;
else if(ch == 'X')
return 10;
else if(ch == 'L')
return 50;
else if(ch == 'C')
return 100;
else if(ch == 'D')
return 500;
else if(ch == 'M')
return 1000;
else
return 0;
}
int romanToInt(string s) {
int len=s.size()-1;
int prev=0;
int sum=0;
for(len=s.size()-1;len>=0;len--)
{
int tmp=change(s[len]);
prev=prev > tmp ? -tmp:tmp;
sum+=prev;
}
return sum;
}
};
最长的公共前缀
- 从左到右遍历 strs 的每一列。
- 设当前遍历到第 j 列,从上到下遍历这一列的字母。
- 设当前遍历到第 i 行,即 strs[i][j]。如果 j 等于 strs[i] 的长度,或者 strs[i][j] != strs[i][0],说明这一列的字母缺失或者不全一样,那么最长公共前缀的长度等于 j,返回 strs[0] 的长为 j 的前缀。
- 如果没有中途返回,说明所有字符串都有一个等于 strs[0] 的前缀,那么最长公共前缀就是 strs[0]。
c
char* longestCommonPrefix(char** strs, int strsSize) {
char* str=strs[0];
for(int j=0;str[j];j++)
{
for(int i=0;i<strsSize;i++)
{
if(strs[i][j] != str[j])
{
str[j]='\0';
return str;
}
}
}
return str;
}