找两个字符串中添加的那个字符

本文通过三次迭代改进了查找两字符串间额外字符的算法。从最初基于匹配的尝试到最终利用字符计数的方法,解决了包括重复字符及乱序字符串等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
这里写图片描述
第一次的代码:

char findTheDifference(char* s, char* t) {
    char* aa = s;
    while (*t)
    {
        while (*s)
        {
            if (*s==*t)
            {
                t++;
                s = aa;
                break;
            }
            s++;
        }
        if (!*s)
        {
            break;
        }
    }
    return *t;
}

第一次的代码确实能解决一部分问题,因为示例给的是没有重复字母的组合”abcd”和”abcde”,但是如果给的是有重复的字符,比如给的字符串是”aa”和”aaa”,那么这个代码就是错误的。

第二次的代码

char findTheDifference(char* s, char* t) {
    while (*s&&*t)
    {
        if (*s!=*t)
        {
            break;
        }
        s++;
        t++;
    }
    return *t;
}

这次的函数是按顺序对比每一个字母,直到发现不同。
第二次的代码解决上一次的问题,但是,问题又来了,如果给的字母组合不是按顺序排列的,那这个代码也是错的,比如字符串是”abcde”和”cbdafe”,那么运行就会出错

最终代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
char findTheDifference(char* s, char* t) {
    int ia = 0;
    int ib = 0;
    char* aa = s;
    char* bb = t;
    char* m = t;
    while (*m)
    {
        t = bb;
        while (*t)
        {
            if (*m == *t)
            {
                ia++;
                t++;
            }
            else
            {
                t++;
            }

        }

        s = aa;
        while (*s)
        {
            if (*m == *s)
            {
                ib++;
                s++;
            }
            else
            {
                s++;
            }

        }

        if (ia>ib)
        {
            break;
        }
        m++;
    }
    return *m;
}
int main()
{
    char* a = "abcde";
    char* b = "cdefab";
    printf("%c", findTheDifference(a, b));
}

最后我完全换了一种思想,不再去找不同,而是比较每一个字母在各自的字符串出现的次数,如果次数不一样,就找到了增加的字母。而且完全解决之前的两个问题,线上测试也完美通过。
运行结果:
这里写图片描述

这里写图片描述

实际上这么简单的题目,我一开始是不在意的,但是计算到后面,发现这个问题还真不是看上去这么简单。花费的时间比之前的题目都要长。程序员的辛苦之处就在这里吧—要考虑到各种发生的情况并解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值