找位置(华科复试上机)

前言:

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

二维向量实现

猜你喜欢

转载自blog.csdn.net/weixin_44897291/article/details/112802401
今日推荐