7.7日记
12. Integer to Roman
题目大意:给出罗马数字的表示方式,给定一个数字,要求写出它所对应的罗马数字
解题过程:这题坑就坑在4\9\49这样的数字的表示
但是!我们可以直接把这些数字所对应的罗马数字拿出来,专门做为一种表示方法。这样每种情况就对应一种罗马数字。
代码如下——
class Solution {
public:
string intToRoman(int num) {
//直接把40和90当成一个元素就可以了
int arr[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
string brr[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int q;
string str = "";
while(num)
{
int i = 0;
for(;;i++)
{
q = num/arr[i];
if(q>0)
break;
}
while(q--)
{
str += brr[i];
}
num = num%arr[i];
}
return str;
}
};
13. Roman to Integer
题意:这一题刚好反过来,给出罗马数字,要求写出所对应的阿拉伯数字
解题过程:有了上一题之后,这一题稍微会好一点。其实在上一题的时候,我就很想用switch语句了,刚好更适合这一道题。其实对于罗马数字来说,一般都是前一个字母所对应的数字要大于后一个数字,对于特殊情况——(见上题图)就是前一个数字所对应的数字比后一个数字要小,用switch语句代码如下——
class Solution {
public:
int romanToInt(string s) {
int len = s.length(),sum = 0;
for(int i=0;i<len-1;i++)
{
if(how(s[i]) >= how(s[i+1]))
sum += how(s[i]);
else
sum -= how(s[i]);
}
//退出来的时候还差最后一个元素
sum += how(s[len-1]);
return sum;
}
int how(char a)
{
switch(a)
{
case 'I':return 1;
break;
case 'V':return 5;
break;
case 'X':return 10;
break;
case 'L':return 50;
break;
case 'C':return 100;
break;
case 'D':return 500;
break;
case 'M':return 1000;
break;
}
return 0;
}
};
然后由于之前并没有按照题目列表一题一题做,所以开始去补一下之前的题目
1. Two Sum
题意:很明了,给定一个数值,给定一个数组,求数组中有没有两个数字相加刚好等于所给数值的
解题过程:用python来做就太简单了,遍历一遍数组,然后求target-array[i],判断这个值是不是在数组中,是的话就append到另一个列表,代码如下——
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
d={}
ans=[]
for i in range(len(nums)):
# print(i)
if nums[i] in d:
ans.append(d[nums[i]])
ans.append(i)
break
else:
d[target-nums[i]]=i
return ans