C语言PTA经典习题————去重

 

输入样例:

ad2f3adjfeainzzzv

 输出样例:

23adefijnvz

解题思路:

主要是去重的算法:创建两个空字符串,一个str用于存取输入的字符串,(注意这里用的是gets函数,scanf会读取不了空格,不能满足后台样例的哦),另一个new用于判断唯一新字符的出现,(运用for循环嵌套遍历查重,跟冒泡排序蛮像的),一个重要的计数器变量t,每次出现新字符都靠它来自增哦。 

然后是冒牌排序的简单运用,根据Ascall码的大小进行排序,输出即可。

完整代码如下:

#include <stdio.h>
#include <string.h>

int main()
{
    char str[100];//存储原始字符串
    char new[100];//去重保留字符串

    gets(str);//虽然被嫌弃,但是scanf碰到空格就要停了,还得是gets

    int i,j,t=0;
    int flag = 0;//标记变量,循环里要时刻记得重置,不然就要bug了
    char temp;//用来交换变量的

    for (i = 0; str[i] != '\0'; i++)//惯用字符串结束标志'\0'判断循环哦
    {//该算法类似于冒泡排序,即每一个str中的字符都要拿出来跟new中的字符比较,遍历new后发现没有出现过一样的值,flag就是0,即可以添加到new里面
        flag = 0;//你看,记得重置!!
        for (j = 0; j < i; j++)
        {
            if(str[i]==str[j])
            {
                flag = 1;//标记值变为1,等下不能添加到new里面了
                break;//直接跳出for循环,节省时间
            }
        }//每一个str[i]和new里面所有值比较过后,由flag判断啦
        if(flag==0)//没有出现过重复值
        {
            new[t] = str[i];
            t++;//t是独立自增的,跟新值出现有关
        }
    }

    new[t] = '\0';//t的值偏大了,记得添加结束符

    for (i = 0;new[i]!='\0';i++)//简单的冒泡排序
    {
        for (j = 0; j < t - i - 1;j++)
        {
            if(new[j]>new[j+1])
            {
                temp = new[j];
                new[j] = new[j + 1];
                new[j + 1] = temp;
            }
        }
    }//还是不会冒泡排序的可以上记事本背代码了!!!

    puts(new);//输出排序结束的new字符串,puts函数会自动换行哦

    return 0;
}

以上是Macos的vs code执行结果。

希望对你有帮助哦。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值