1. 程式人生 > >輸出矩陣每行都出現的字元

輸出矩陣每行都出現的字元

沒事刷一道演算法題目,這是道水題,但還是挺有趣的

題目描述

    輸入一個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; 
}