一.罗马数字转换整数
题目描述如下:
代码如下:
int romanToInt(char* s) {
int l,i,t,sum=0,m=0;
l=strlen(s);
for(i=0;i<l;i++)
{
switch(s[i])
{
case 'I' :
t=1;
break;
case 'V' :
t=5;
break;
case 'X' :
t=10;
break;
case 'L' :
t=50;
break;
case 'C' :
t=100;
break;
case 'D' :
t=500;
break;
case 'M' :
t=1000;
break;
}
if(i==0)
{
m=t;
}
else if(m>=t)
{
sum+=m;
m=t;
}
else if(m<t)
{
sum=sum-m;
m=t;
}
}
sum=sum+m;
return sum;
}
解题思路如下:
首先看到这道题我思考的是如何将罗马数字用阿拉伯数字表示,然后我运用switch.case的方式,使用了for循环对每个字母进行判断并相加,并且思考了4,9,400,900等特殊数字的输出,发现罗马数字的大小是从左到右每个字母所表示的数字加起来的,在无特殊数字(4,9,40,90)的情况下,每个字母所表示的数字都是左边的大于右边的,而有特殊数字时,特殊数字表示的方法为每个字母所表示的数字都是左边的小于右边的,这也就是本题的关键之处。当当前数字大于下一位数字时,对当前数字相加,小于时则相减。
二.爬楼梯
题目描述:
代码如下:
int climbStairs(int n) {
int *a=(int *)malloc((n+1)*sizeof(int));
a[0]=1,a[1]=1;
if(n==1)
{
return 1;
}
else
{
for(int i=2;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
}
}
return a[n];
}
解题思路:
在对题目和数据进行分析后,可以发现我们这是与斐波那契数列相关的一道题,我们可以利用斐波那契数列的相关性质,从第三的数字开始后的每个数字都等于前两个数字之和,一共有n个数字,但数组下标从0开始,所以应该创建一个元素大小为n+1的数组a。对a[0],a[1]进行初始化1,并对1进特判。从数组a[2]开始就可以利用循环对前两个数字相加得出结果了。