XDOJ 333 找位置

  1. 题目: 找位置

    问题描述

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

    输入格式

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

    输出格式

    可能有多组测试数据,对于每组数据,

    按照样例输出的格式将字符出现的位置标出。

    1、下标从0开始。

    2、相同的字母在一行表示出其出现过的位置。

    样例输入

    abcaaAB12ab12

    样例输出

    a:0,a:3,a:4,a:9

    b:1,b:10

    1:7,1:11

    2:8,2:12

    样例说明

    给定字符串中重复的字母有a,b,1,2,依次输出上述每个字母在字符串中的全部位置。

  2. 思路建立所有包含可能字符的结构体数组,遍历字符串并修改结构体数组中关于字符个数和位置的成员变量,最后按格式输出结果。
  3. 代码
    #include<iostream>
    #include<string>
    #include<queue>
    using namespace std;
    typedef struct{
    	int mark;  //字符的ASCII码 
    	int num;  //字符的个数
    	queue<int> add;  //队列储存字符的位置
    }Char;
    
    Char data[62];
    
    void init(){//初始化,放入0-9,A-Z,a-z; 
    	int i;
    	for(i = 0;i < 10;i++){
    		data[i].mark = '0'+i;
    		data[i].num = 0;
    	}
    	for(i = 10;i < 62;i++){
    		data[i].mark = 'A'+i;
    		data[i+26].mark = 'a'+i;
    		data[i].num = data[i+26].num = 0;
    	} 
    }
    
    int main(){
    	init();
    	string str;
    	cin>>str; 
    	int i,k;
    	for(i = 0;i < str.size();i++){
    		if(str[i] < 'A'){
    			k = str[i] - '0';	
    		} 
    		else if(str[i] < 'a'){
    			k = str[i] - 'A' + 10;
    		}
    		else if(str[i] > 'Z'){
    			k = str[i] - 'a' + 36;
    		}
    		data[k].num++;
    		data[k].add.push(i);
    	}
    	
    	for(i = 0;i < str.size();i++){
    		if(str[i] < 'A'){
    			k = str[i] - '0';	
    		} 
    		else if(str[i] < 'a'){
    			k = str[i] - 'A' + 10;
    		}
    		else if(str[i] > 'Z'){
    			k = str[i] - 'a' + 36;
    		}
    		if(data[k].add.size() > 1){//当字符有重复时输出,输出后该字符的储存位置的队列清空了
    			while(!data[k].add.empty() && data[k].add.size() > 1){
    				cout<<str[i]<<':'<<data[k].add.front()<<',';
    				data[k].add.pop();
    			}
    			cout<<str[i]<<':'<<data[k].add.front()<<endl;
    			data[k].add.pop();
    		}
    	}
    	return 0;
    }
  4. Tip:ASCII码中大写字母在小写字母前面排着。
上一篇:Redflag Linux Server 4.1 架设sybase数据库


下一篇:Python自动化开发-数据类型之集合