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

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

题目描述

    输入一个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; 
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值