前言:
21考研,不论能否进复试记录一下准备路上写下的垃圾代码。本来啃《算法笔记》,但是感觉太多了做不完,改做王道机试指南。
题目描述:
对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 输出:a,1;a,4;a,5;a,10,b,2;b,11,1,8;1,12, 2,9;2,13。
输入描述
输入包括一个由字母和数字组成的字符串,其长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据,
按照样例输出的格式将字符出现的位置标出。
1、下标从0开始。
2、相同的字母在一行表示出其出现过的位置。
解答
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<stdio.h>
using namespace std;
struct num {
char letter;
vector<int> loc;
};
int find_letter(vector<num> vi,char str) {
//确定数组中是否已有该字母,无返回-1,有则返回下标
for (int i = 0; i < vi.size(); i++)
if (vi[i].letter == str)
return i;
return -1;
}
int main()
{
string str;
int temp;
while (cin >> str) {
vector<num> vi;
for (int i = 0; i < str.length(); i++) {
temp = find_letter(vi, str[i]);
if (temp == -1) {
//首次出现字母
num tool;
tool.letter = str[i];
tool.loc.push_back(i);
vi.push_back(tool);
}
else
vi[temp].loc.push_back(i); //非首次出现则记录字符串中下标
}
for (int i = 0; i < vi.size(); i++) //删除只出现一次的字符
if (vi[i].loc.size() == 1) {
vi.erase(vi.begin() + i, vi.begin() + i + 1);
i--;
}
for (int i = 0; i < vi.size(); i++) {
for (int j = 0; j < vi[i].loc.size(); j++)
if (j != vi[i].loc.size() - 1)
cout << vi[i].letter << ':' << vi[i].loc[j] << ',';
else
cout << vi[i].letter << ':' << vi[i].loc[j];
cout << endl;
}
}
return 0;
}
二维向量实现