1.罗马数字转整数(13)
题目链接:罗马数字转整数
自己写的:
int romanToInt(char * s){
int sum=0;
for(;*s;s++)
{
sum+=fun(s);
if(*s=='I'&&(*(s+1)=='V'||*(s+1)=='X'))
sum-=2;
if(*s=='X'&&(*(s+1)=='L'||*(s+1)=='C'))
sum-=20;
if(*s=='C'&&(*(s+1)=='M'||*(s+1)=='D'))
sum-=200;
}
return sum;
}
int fun(char *s)
{
int a;
switch(*s)
{
case 'I':
a=1;
break;
case 'V':
a=5;
break;
case 'X':
a=10;
break;
case 'L':
a=50;
break;
case 'C':
a=100;
break;
case 'D':
a=500;
break;
case 'M':
a=1000;
break;
}
return a;
}
提速:
稍微小小的纪念一下,鼓励一下自己,💐(难得一次性在力扣写对!!)
1.想一哈
刚开始磕绊了,不知道该怎么存储IVLCDM,以及他们对应的值,以及特殊情况的处理方法
- 当一个值和另一个值相对应时可以考虑switch语句
- 当涉及到两个值决定最终结果时,可以来个判断语句,同时加上了之后再减去
可以改动:
int romanToInt(char * s){
int ans=0,sum=0,i=0;
int n = strlen(s);
for(;*s;s++)
{
//不同之处在于,如何判断特殊情况的运算
ans=fun(s);
if(i<n-1&&fun(s+1)>ans)
sum-=ans;
else
sum+=ans;
i++;
}
return sum;
}
int fun(char *s)
{
int a;
switch(*s)
{
case 'I':
a=1;
break;
case 'V':
a=5;
break;
case 'X':
a=10;
break;
case 'L':
a=50;
break;
case 'C':
a=100;
break;
case 'D':
a=500;
break;
case 'M':
a=1000;
break;
}
return a;
}
1.ASII码:
单个字符的保存实际上为ASCII码,但是罗马数字的字母表示大小顺序,未必和ASII码中顺序一致
2.最长公共前缀(14)
题目链接:最长公共前缀
自创版:
char * longestCommonPrefix(char ** strs, int strsSize){
int i,j,min=INT_MAX;
for(i=0;i<strsSize-1;i++)
{
//解决含2个以上的字符串的(之前没考虑到)
if(strlen(strs[i])==0)
return "";
//让第一个字符串固定,依次与后面的字符串进行比较
//(应该保证比较的都是'/0'前的,没考虑到)
for(j=0;strs[0][j]&&strs[0][j]==strs[i+1][j];j++);
if(min>j)
min=j;
}
//单个字符串以及一个空字符串
if(min==INT_MAX)
{
if(strsSize==1)
return strs[0];
return "";
}
else
{
strs[0][min]='\0';
return strs[0];
}
}
拖我后腿的:
1.出现的所有情况考虑不清
比如:一个空字符串,一个空字符串和n个有效字符串,一个字符串,多个字符串
方法选用的不是太合理,不能涵盖较多钟情况
2.strlen函数
不太会用
strlen(strs[0])
表示第一个字符串长度(不含'\0'
)
3.字符数组的表示比较模糊
有待巩固
4.一些数据结构和算法还不了解
分治、二分查找,有待学习
3.心路历程(2021.8.3):
今天嘻嘻哈哈的玩了好一阵,本来想今天偷个懒,CSDN不打卡做题了,但是看了会儿奥运会,在比赛马上结束时有一个跳高的小哥哥,在金牌🏅稳了时,又去挑战了一下世界纪录,虽然差一点就打破了吧,全场都期待着啊,真是好棒啊,想想我这又算啥,然后就来做题咯。
今天做题速度快了点,一遍一遍试错,最后显示绿色通过的那一刻,开心开心,剩下欠缺的部分之后再补充吧😉