輸出矩陣每行都出現的字元
阿新 • • 發佈:2019-01-01
沒事刷一道演算法題目,這是道水題,但還是挺有趣的
題目描述
輸入一個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; }