输出矩阵每行都出现的字符

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljt735029684/article/details/80821495

没事刷一道算法题目,这是道水题,但还是挺有趣的

题目描述

    输入一个n*m矩阵,输出矩阵每行都出现的字符,如果有多个,输出字典序最小的字符

思路都写注释里了


/*
	输出每行都出现的字符,如果有多个,输出字典序最小的 
	
	思路:记录每个字符最后一次出现的行数(通过判断每行上次出现是在上一行)  
	
	map可以输出字典序最小的, 底层红黑树会自动排序 
	
	伪代码:
		遍历数组第 i 行
			遍历数组第 j 列
				if 此字符没有出现,加入集合
				else if 判断此字符最后出现行数是否是i - 1, 是的话+=1, 
	
		遍历集合:
			如果最后行数到达n-1,输出				 
*/
#include<iostream>
#include<map>
#define MAXV 256 

using namespace std;

char a[MAXV][MAXV];
int n, m;

char seachSame()
{
	map<char, int> num;//保存所有出现数字的集合 
	
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			//如果没有出现 
			if(num.find(a[i][j]) == num.end())
				num[a[i][j]] = 0;
			//每行只允许计算一次 
			else if(num[a[i][j]] == i - 1)
				num[a[i][j]]++;	
		}
	
	}
	
	int max = -1;
	char maxc = 0;
	
	map<char, int>::iterator it;
	for(it = num.begin(); it != num.end(); it++)
	{
		if(n - 1 == it->second)
			return it->first;
	}
	
	return 0; 
}

int main()
{
	//freopen("same2.in", "r", stdin);
	
	cin >> n >> m;
	cout << n << m << endl; 
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			cin >> a[i][j];
		}
		
	}
	
	cout << seachSame() << endl; 
	
	return 0;
} 

当然也可以用map初始化为第0行的数字,因为没有在第0行出现则代表不可能所有行都出现,可以改成这样,可以减掉一些不必要二代计算

char seachSame()
{
	map<char, int> num;//保存所有出现数字的集合 
	
	for(int j = 0; j < m; j++)
		num[a[0][j]] = 0;
	
	
	for(int i = 1; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			if(num.find(a[i][j]) != num.end())
				if(num[a[i][j]] == i - 1)
					num[a[i][j]]++;	
		}
	
	}
	
	int max = -1;
	char maxc = 0;
	
	map<char, int>::iterator it;
	for(it = num.begin(); it != num.end(); it++)
	{
		if(n - 1 == it->second)
			return it->first;
	}
	
	return 0; 
}





猜你喜欢

转载自blog.csdn.net/ljt735029684/article/details/80821495
今日推荐