力扣刷题13、14(小小白亲测,Bug你准没我的多,hhh)

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不打卡做题了,但是看了会儿奥运会,在比赛马上结束时有一个跳高的小哥哥,在金牌🏅稳了时,又去挑战了一下世界纪录,虽然差一点就打破了吧,全场都期待着啊,真是好棒啊,想想我这又算啥,然后就来做题咯。
今天做题速度快了点,一遍一遍试错,最后显示绿色通过的那一刻,开心开心,剩下欠缺的部分之后再补充吧😉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值