华科:找位置

题目描述

对给定的一个字符串,找出有重复的字符,并给出其位置。

输入描述:

输入包括一个由字母和数字组成的字符串,其长度不超过100。

输出描述:

可能有多组测试数据,对于每组数据,
按照样例输出的格式将字符出现的位置标出。

1、下标从0开始。
2、相同的字母在一行表示出其出现过的位置。
示例1

输入

abcaaAB12ab12

输出

a:0,a:3,a:4,a:9
b:1,b:10
1:7,1:11
2:8,2:12

应该说这个题是相当变态的,如果没有学过map我都不知道该怎么做!!!这是我见过最难的华科题了!!!

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <map>
using namespace std;

int main()
{
    char s[100],ch;
    int i,j,k,flag;//flag用来表示当前字符后面是否还有跟自己一样字母的标志位,用于输出,或者endl,顺便吐槽该死的格式
    map<char,int> m,f;//m代表字符出现的次数,f为1代表这个字母已经输出过
    while(cin>>s)
    {
        /*对数字、大小写字母出现的次数进行初始化操作*/
        for(ch='0';ch<='9';ch++)
            m[ch]=f[ch]=0;
        for(ch='a';ch<='z';ch++)
            m[ch]=f[ch]=0;
        for(ch='A';ch<='Z';ch++)
            m[ch]=f[ch]=0;
        for(i=0;s[i]!='\0';i++)
            m[s[i]]++;
        /*开始寻找*/
        for(i=0;s[i]!='\0';i++)//从头到尾扫描
            if(m[s[i]]>=2&&!f[s[i]])//发现出现次数>=2的,并且之前没有输出过的,就要将他输出
            {
                /*输出之前,得干两件事*/
                /*第一,让它的f标志位置1,防止重复输出*/
                /*第二,为了格式,要判断这是不是整个串中最后一次出现这个字符,因此引入flag变量来判断*/
                f[s[i]]=1;
                for(j=0;s[j]!='\0';j++)//从头到尾扫描,就是为了找到和刚才匹配的字母
                    if(s[j]==s[i])//好,现在找到了一个,那么这个到底是不是最后一个呢?
                    {
                        flag=0;//这个flag必须要放在这!因为对于每一个j指向的标识符,我都要判断它是不是最后一个!
                        for(k=j+1;s[k]!='\0';k++)//从j的后一位开始找,看有没有长得和它一样的,如果有就让flag置1,并退出循环
                            if(s[k]==s[j])
                            {
                                flag=1;
                                break;
                            }
                        if(flag==1)//如果有,说明不是最后一个,就输出逗号,
                            cout<<s[j]<<":"<<j<<",";
                        else
                            cout<<s[j]<<":"<<j<<endl;//不然就说明是最后一个,就需要换行!
                    }
            }
    }
}
/*T_T 麻烦的一题终于结束!*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值