場所を見つける(マシンでのHuakeの再テスト)

序文:

21.再テストに参加できるかどうかに関係なく、道路に書かれたゴミコードを記録します。もともと「AlgorithmNotes」をかじったのですが、やりすぎたので、Kingway ComputerTestGuideに変更しました。

タイトル説明:

特定の文字列について、繰り返される文字を見つけて、次のようにそれらの位置を指定します。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.同じ文字は、1行に表示された位置を示します。

回答

#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;
}

二次元ベクトルの実装

おすすめ

転載: blog.csdn.net/weixin_44897291/article/details/112802401