对于给定的由大小写字母混合构成的 个单词,输出按字典序从小到大排序后的结果。
从字符串的第一个字符开始逐个比较,直到找到第一个不同的位置,通过比较这个位置字符对应的 码( )得出字符串的大小,称为字典序比较。
从字符串的第一个字符开始逐个比较,直到找到第一个不同的位置,通过比较这个位置字符对应的 码( )得出字符串的大小,称为字典序比较。
第一行输入一个整数 代表给定的单词个数。
此后 行,每行输入一个长度 ,由大小写字母混合构成的字符串 ,代表一个单词。
输出 行,每行输出一个字符串,代表排序后的结果。第一行输出字典序最小的单词。
11 cap to cat card two too up boat boot AA Aa
AA Aa boat boot cap card cat to too two up
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; string s; map<string, int> map; for (int i = 0; i < n; i++) { cin >> s; map[s] += 1; } for (auto i : map) { for (int k = 0; k < i.second; k++) { cout << i.first << endl; } } return 0; }
lists = [] def cmp(s1, s2): l = len(s2) if s1 == s2: return True for i, c1 in enumerate(s1): if i >= l: return 1 c2 = s2[i] if c1 != c2: return ord(c1) - ord(c2) return len(s1) - len(s2) def fun2(s1, s2): l = len(s2) if s1 == s2: return True for i, c1 in enumerate(s1): if i >= l: return False c2 = s2[i] if c1 > c2: return False elif c1 < c2: return True return False def quick_sort(i, j): if i >= j: return lists low, high = i, j p = lists[i] while i<j: while i < j and cmp(lists[j], p) >= 0: j -= 1 lists[i] = lists[j] while i < j and cmp(lists[i], p) <= 0: i += 1 lists[j] = lists[i] lists[i] = p quick_sort(low, i-1) quick_sort(i+1, high) while True: try: n = int(input()) lists = [] for i in range(n): lists.append(input()) quick_sort(0, len(lists) - 1) for s in lists: print(s) except EOFError: break
不用直接交换字符串,可以设置一个指针数组指向每一个串的首地址,然后对这个指针数组进行排序即可。使用快速排序算法:
#include <stdio.h> #include <string.h> char ss[1000][101]; char* ps[1000]; void swap(int i, int j) { char* tmp = ps[i]; ps[i] = ps[j]; ps[j] = tmp; } int partition(int p, int r) { char* pivot = ps[r]; int i = p - 1, j; for (j = p; j <= r - 1; ++j) { if (strcmp(ps[j], pivot) <= 0) { ++i; if (i != j) swap(i, j); } } swap(i + 1, j); return i + 1; } void qsort(int p, int r) { if (p >= r) return; int q = partition(p, r); qsort(p, q - 1); qsort(q + 1, r); } int main() { int n; scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%s", ss[i]); ps[i] = ss[i]; } qsort(0, n - 1); for (int i = 0; i < n; ++i) printf("%s\n", ps[i]); return 0; }
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; int main() { int n; string s; vector<string> v; cin >> n; while(n-- && cin >> s) v.push_back(s); sort(v.begin(), v.end()); for(auto it=v.begin();it!=v.end();it++) cout<< *it << endl; return 0; }我承认不应该用泛型算法,但是sort()函数真香!
#include <stdlib.h> #include <stdio.h> #include <string.h> #define N_STRS 1000 #define STR_LEN 100 void str_quick_sort(char str[N_STRS][STR_LEN], int low, int high) { char *temp = (char *)malloc(sizeof(char) * STR_LEN); int i=low, j=high; if(low < high) { strcpy(temp, str[low]); while(i != j) { while(j>i && strcmp(str[j], temp)>0) --j; if(i<j) { strcpy(str[i],str[j]); ++i; } while(i<j && strcmp(str[i], temp)<0) ++i; if(i<j) { strcpy(str[j],str[i]); --j; } } strcpy(str[i],temp); str_quick_sort(str, low, i-1); str_quick_sort(str, i+1, high); } } int main() { char str[N_STRS][STR_LEN] = {'\0'}; int n; scanf("%d\n", &n); for(int i=0; i<n; i++) { scanf("%s\n", str[i]); } str_quick_sort(str, 0, n-1); for(int i=0; i<n; i++) { printf("%s\n", str[i]); } return 0; }
import sys n = int(sys.stdin.readline().strip()) a, result = [], [] for i in range(n): a.append(sys.stdin.readline().strip()) for n1 in range(n,1,-1): for i in range(n1-1): j = 1 pos1, pos2 = ord(a[i][0]), ord(a[i+1][0]) while pos1 == pos2 and j<min(len(a[i]),len(a[i+1])): pos1, pos2 = ord(a[i][j]), ord(a[i+1][j]) j += 1 if pos1 == pos2: pos1, pos2 = len(a[i]), len(a[i+1]) if pos1 > pos2: a[i:i+2] = [a[i+1],a[i]] for i in range(n): print(a[i])用C的思路写的python,然而实际python一个函数就能搞定
import java.util.*; public class Main{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); List<String> result = new ArrayList<>(); for (int i = 0; i < num; i++){ result.add(scanner.next()); } Collections.sort(result); for (int j = 0; j < result.size(); j++){ System.out.println(result.get(j)); } } }
import java.util.Scanner; import java.util.TreeSet; /** * 字符串的连接最长路径查找 * 给定n个字符串,请对n个字符串按照字典序排列。 * 输入描述: * 输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。 * 输出描述: * 数据输出n行,输出结果为按照字典序排列的字符串 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()){ int n = Integer.parseInt(sc.nextLine()); String[] strs = new String[n]; for(int i = 0;i<n;i++){ String s = sc.nextLine(); strs[i] = s; } sortDict(strs); } } public static void sortDict(String[] strings){ if(strings==null||strings.length<=0){ return; } TreeSet<String> treeSet = new TreeSet<>(); for(int i = 0;i<strings.length;i++){ treeSet.add(strings[i]); } for (String s:treeSet){ System.out.println(s); } } }但是这个代码的通过率只有60%,有大佬可以帮忙看下吗,我自己按照题目给的出错案例,出来的结果是没有问题,但是牛客说我的输出是有问题。。。。我就不明白了
import java.util.Scanner; import java.util.List; import java.util.ArrayList; import java.util.Collections; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int size = scanner.nextInt(); List<String> wordList = new ArrayList<>(); for (int i = 0; i <= size; i++) { String word = scanner.nextLine().trim(); if (!word.matches("[a-zA-Z].*")) { continue; } if (!word.isEmpty()) { wordList.add(word); } } Collections.sort(wordList); wordList.forEach(System.out::println); } } }
#include <bits/stdc++.h> using namespace std; int main(){ int n; while(cin >> n){ vector<string> vec(n); for(int i=0;i<n;++i) cin>>vec[i]; stable_sort(vec.begin(), vec.end(), [](const string& s1,const string& s2){return s1 < s2;}); for(auto i:vec) cout << i << endl; } return 0; }
#include <iostream> #include <set> using namespace std; int main() { ios::sync_with_stdio(false); string strInput; multiset<string> setStr; size_t sizeStr; cin >> sizeStr; for (size_t counter = 0; counter < sizeStr; ++counter) { cin >> strInput; setStr.insert(strInput); } for (auto const &elem : setStr) cout << elem << '\n'; return 0; }