日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。