當(dāng)前位置:
首頁(yè) >
信息学奥赛一本通 1185:单词排序 | OpenJudge NOI 1.10 10:单词排序
發(fā)布時(shí)間:2025/3/17
43
豆豆
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1185:单词排序 | OpenJudge NOI 1.10 10:单词排序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【題目鏈接】
ybt 1185:單詞排序
OpenJudge NOI 1.10 10:單詞排序
【題目考點(diǎn)】
1. 排序
【君義精講】排序算法
2. 字符串比較
- 字符數(shù)組比較:
char s1[N], s2[N];
strcmp(s1, s2)
返回正數(shù):s1大于s2
返回負(fù)數(shù):s1小于s2
返回0:s1等于s2。
s1小于s2指的是按字典序排序,s1在s2前。 - string類對(duì)象比較
string s1, s2;
可以直接用>, <, >=, <=, !=, ==來比較兩個(gè)字符串
3. 讀入多個(gè)由空格分隔的字符串
寫while(cin >> s)或while(scanf("%s", s)!=EOF),可以讀入由多個(gè)空格分隔的字符串。本機(jī)調(diào)試時(shí)要想結(jié)束程序,需要輸入Ctrl+z,再按回車,即可結(jié)束。
【解題思路】
- 輸入過程可以通過while(cin>>s)來輸入由空格分開的多個(gè)字符串,或讀入整個(gè)字符串后解析出各個(gè)單詞。
- 字符串的存儲(chǔ)結(jié)構(gòu)可以選擇二維字符數(shù)組、指針數(shù)組,或string類。
- 排序方法隨意選擇。
- 輸出時(shí)有三種方法可以避免輸出相同的元素:
- 可以先輸出第一個(gè)字符串,后面的要輸出的字符串如果與前一個(gè)相同,則不輸出。與前一個(gè)不同則輸出。這樣如果有連續(xù)相同的多個(gè)字符串,只會(huì)輸出第一個(gè)。
- 如果當(dāng)前字符串與后一個(gè)相同則不輸出,不同則輸出。最后一個(gè)字符串單獨(dú)輸出。這樣可以輸出連續(xù)相同的字符串中的最后一個(gè)。
- 用一個(gè)變量記錄先前輸出的字符串,當(dāng)前要輸出的如果與先前輸出的相同,則不輸出。否則輸出,并記錄。
【題解代碼】
解法1:讀入多個(gè)字符串,string類數(shù)組保存,STL sort排序,輸出與前一個(gè)不同的元素
#include<bits/stdc++.h> using namespace std; #define N 105 int main() {string s[N];int n = 1;while(cin >> s[n])n++;n--;//最后一次輸入的值是EOF,不是有效的值,n應(yīng)該減1 sort(s+1, s+1+n); cout << s[1] << endl;for(int i = 2; i <= n; ++i)if(s[i] != s[i-1])cout << s[i] << endl; return 0; }解法2:讀入多個(gè)字符串,string類數(shù)組保存,選擇排序,輸出與后一個(gè)不同的元素
#include<bits/stdc++.h> using namespace std; #define N 105 int main() {string s[N];int n = 1;while(cin >> s[n])n++;n--;//最后一次輸入的值是EOF,不是有效的值,n應(yīng)該減1 for(int i = 1; i <= n-1; ++i)//選擇排序 for(int j = i+1; j <= n; ++j)if(s[j] < s[i])swap(s[j], s[i]);for(int i = 1; i < n; ++i)if(s[i] != s[i+1])cout << s[i] << endl;cout << s[n] << endl; return 0; }解法3:讀入整句后解析,二維字符數(shù)組保存,插入排序,用字符數(shù)組記錄上一次輸出的字符串
#include<bits/stdc++.h> using namespace std; int main() {char words[105][55], tword[55], temp[55];//二維數(shù)組保存多個(gè)單詞 int ti = 0, wi = 0;//t_i:tword中的下標(biāo) w_i:words中的下標(biāo) char s[10005];cin.getline(s, 10005);int len = strlen(s);for(int i = 0; i <= len; ++i)//解析整個(gè)字符串 {if(s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z')//如果是字母 words[wi][ti++] = s[i];//wi單詞添加字母s[i] else//如果是空格或'\0' {if(ti == 0)//如果沒有添加字母,那么可能是遇到連續(xù)的空格,不添加單詞 continue;words[wi++][ti] = '\0';//把words[wi]構(gòu)成一個(gè)字符串ti = 0;for(int j = wi-1; j >= 1; --j)//插入排序 {if(strcmp(words[j], words[j-1]) < 0)//如果右面單詞的比左面的小 {//交換兩個(gè)字符串 strcpy(temp, words[j]);strcpy(words[j], words[j-1]);strcpy(words[j-1], temp);}elsebreak;}}}strcpy(temp, "");//用temp保存上一個(gè)取到的單詞 for(int i = 0; i < wi; ++i){if(strcmp(words[i], temp) != 0){cout << words[i] << endl;strcpy(temp, words[i]);}}return 0; }總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通 1185:单词排序 | OpenJudge NOI 1.10 10:单词排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker run命令_CVE-201
- 下一篇: 虚拟机无法接受组播消息_基于UDP的组播