找位置,这题要命了
找位置
http://www.nowcoder.com/questionTerminal/e3b2cc44aa9b4851bdca89dd79c53150
//////////////////////////////////////////////////////////////////////////////////////////////////// //濒临吐血 //////////////////////////////////////////////////////////////////////////////////////////////////// #include <iostream> #include <cstdio> #include <string> #include <queue> //队列库 using namespace std; const int MAXSIZE = 100; struct ALPHA { char str1; //不重复字母有哪些 int number; //重复次数 queue<int> pos; //重复字母下标记录队列 }; ALPHA alpha[MAXSIZE]; int main() { string str; //sting str;不是数组;一个串,是一个文件;放里边 while(getline(cin,str)) { alpha[0].str1=str[0]; //把首个字母放在字母串第一个位置 alpha[0].pos.push(0); //把第一个字母的下标也就是0推进下标队列 alpha[0].number=1;//第一个字母,现在只出现了1个,字母目前为止出现的个数 int k=1;//无重复字母串目前有一个字母 for(int i=1; i<str.size(); ++i) //把str串,挨个轮一遍,分类,收纳 { int m=k;//在循环里,防止k重复刷 //把str里的每一个字母与alpaha挨个比较,相同就记录下标,不同就往alpha里添加新字母 for(int j=0;j<m;++j){ //j<m,m是个数!!!!!!!!!!!!!!!!!!!!!!!! if(str[i]==alpha[j].str1){ //如果相同就在对应字母下添加位置 alpha[j].pos.push(i); alpha[j].number++; //每一个添加,个数就增加一个 break;//要是重复就下一个字母 } if(j==m-1){//要是到最后一个,还没跳出,就说明不是重复的,就得新增!!!!!!!!!!!!!!!!!1 alpha[k].str1=str[i];//反正就是在k这个下标新增,第k+1个,下标是k,字母存进去 alpha[k].pos.push(i);//下标存进去 alpha[k].number=1;//新增,重复一次 k++;//这回第k+1个不重复字母了!!!!!!!!!!!!!!!!!!!!!这很恶心!!!!!!! } } } for(int i=0;i<k;++i){ //i<k,k是个数 if(alpha[i].number>1){ for(int p=0; p<alpha[i].number; ++p) { printf("%c:%d",alpha[i].str1,alpha[i].pos.front());//front是访问队头,不删除!!!!! alpha[i].pos.pop();//这个才是删除队头呢!!!!!!!!!!!!! if(p!=alpha[i].number-1) { printf(","); }else{ printf("\n"); } } } } } } // #include <iostream> // #include <cstdio> // #include <string> // #include <queue> // using namespace std; // const int MAXSIZE = 100; // struct ALPHA // { // char str1; // int number; // queue<int> pos; // }; // ALPHA alpha[MAXSIZE]; // int main() // { // string str; //sting str;不是数组;一个串,是一个文件;放里边 // while(getline(cin,str)) // { // alpha[0].str1=str[0]; // alpha[0].pos.push(0); // alpha[0].number=1;//a有几个重复的 // int k=1;//个数 // int m; // // printf("%d\n",str.size()); // for(int i=1; i<str.size(); ++i) // { // // printf("%d\n",i); // m=k; // // if(i==12) printf("%d\n",k); // // printf("%d\n",i); // for(int j=0;j<m;++j){ // // if(i==12) { // // printf("%c\n",str[i]); // // } // // if(j==2) { // // printf("%c\n",alpha[j].str1); // // } // if(str[i]==alpha[j].str1){ // // printf("%d\n",i); // alpha[j].pos.push(i); // alpha[j].number++; // // if(i==11) printf("%d\n",alpha[7].number); // // printf("[%d+] ",i); // break; // } // if(j==m-1){ // // printf("(%d-) ",i); // // number[i]++; // alpha[k].str1=str[i]; // alpha[k].pos.push(i); // alpha[k].number=1; // k++; // } // } // } // // printf("%d\n",k); // // for(int i=2;i<k;++i){ // // printf("%d:%c\n",i,alpha[i].str1); // // } // for(int i=0;i<k;++i){ // if(alpha[i].number>1){ // // printf("%d\n",alpha[7].number); // for(int p=0; p<alpha[i].number; ++p) // { // printf("%c:%d",alpha[i].str1,alpha[i].pos.front());//front是访问队头,不删除!!!!! // // printf("(%d)",alpha[i].pos.front()); // alpha[i].pos.pop();//这个才是删除队头呢!!!!!!!!!!!!! // // printf("(%d)",alpha[i].pos.front()); // if(p!=alpha[i].number-1) // { // printf(","); // }else{ // printf("\n"); // } // } // } // } // } // } // //////////////////////////////////////////////////////////////////////////////////////////////////// // //自虐玩法 256个ASCII挨个遍历,用上了队列!!!!自杀式玩法,答案缺个排序 // //////////////////////////////////////////////////////////////////////////////////////////////////// // #include <iostream> // #include <cstdio> // // #include <algorithm> // #include <string> // // #include <cstring> // #include <queue> // using namespace std; // const int MAXSIZE = 256; // // const int length = 100; // // int number[MAXSIZE]; // // const int MAXSIZE = 100; // // struct ALPHA{ // // char str1; // // int pos[MAXSIZE]; // // int number; // // }; // struct ALPHA // { // char str1; // // int pos[length]; // int number; // queue<int> pos; // }; // ALPHA alpha[MAXSIZE]; // int main() // { // string str; //sting str;不是数组;一个串,是一个文件;放里边 // while(getline(cin,str)) // { // // int j[length]; // // memset(j,0,length); // for(int i=0; i<str.size(); ++i) // { // // number[i]++; // // number[str[i]-' ']++; // alpha[str[i]].str1=str[i]; // alpha[str[i]].number++; // // alpha[str[i]].pos[++j[str[i]]]=i; // alpha[str[i]].pos.push(i); // } // // for(int i=0; i<MAXSIZE; ++i) // // { // // printf("%d ",alpha[i].number); // // } // // memset(j,0,MAXSIZE); // for(int i=0; i<MAXSIZE; ++i) // { // if(alpha[i].number>1) // { // for(int p=0; p<alpha[i].number; ++p) // { // printf("%c:%d",alpha[i].str1,alpha[i].pos.front());//front是访问队头,不删除!!!!! // alpha[i].pos.pop();//这个才是删除队头呢!!!!!!!!!!!!! // // printf("%c:",alpha[i].str1); // if(p!=alpha[i].number-1) // { // printf(","); // }else{ // printf("\n"); // } // } // } // } // } // } // // while(getline(cin,str)){ // // for(int i=0;i<str.size();++i){ // // printf("\n"); // // } // // int i; // // if(alpha[i].number>1){ // // for(int j=0;j<alpha[i].number;++j){ // // printf("%c:%d",alpha[i].str1,alpha[i].pos); // // if(j==alpha[i].number-1){ // // printf(","); // // } // // } // // } // // } // // } // // printf("%d ",number[i]);