题2.字符串重新排列
给定一个字符串s,s包括以空格分隔的若干个单词,请对s进行如下处理后输出:
1、单词内部调整:对每个单词字母重新按字典序排序
2、单词间顺序调整:
1)统计每个单词出现的次数,并按次数降序排列
2)次数相同,按单词长度升序排列
3)次数和单词长度均相同,按字典升序排列
请输出处理后的字符串,每个单词以一个空格分隔。输入描述:
一行字符串,每个字符取值范围:【a—zA—z0—9】以及空格,字符串长度范围:【1,1000】
例1:
输入 This is an apple
输出 an is This aelpp
主要考察算法和数据结构:字符串排序、对象的使用、数组的排序和遍历
以下是按步骤罗列的解题思路:
- 首先将输入的字符串按照空格分割成单词数组;
- 对每个单词进行内部调整,即重新按照字典序排序。可以使用现成的排序函数,也可以手写一段排序代码;
- 使用一个对象来统计每个单词出现的次数,并按要求进行排序。排序时,可以使用自定义比较函数来实现多级排序,需要注意考虑次数、长度和字典序的优先级关系。最后将排完序的单词拼接成字符串输出。
java实现如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
// 将字符串按空格分割成单词
String[] words = s.split(" ");
// 对每个单词内部进行字典序排序
for (int i = 0; i < words.length; i++) {
char[] wordChars = words[i].toCharArray();
Arrays.sort(wordChars);
words[i] = new String(wordChars);
}
// 统计每个单词出现的次数
Map<String, Integer> wordCountMap = new HashMap<>();
for (String word : words) {
wordCountMap.put(word, wordCountMap.getOrDefault(word, 0) + 1);
}
// 对单词排序,排序规则如题目所述
Arrays.sort(words, (w1, w2) -> {
int count1 = wordCountMap.get(w1);
int count2 = wordCountMap.get(w2);
if (count1 != count2) {
return count2 - count1; // 次数相同,按次数降序排列
} else if (w1.length() != w2.length()) {
return w1.length() - w2.length(); // 次数相同,按单词长度升序排列
} else {
return w1.compareTo(w2); // 次数和单词长度均相同,按字典升序排列
}
});
// 输出处理后的字符串
for (int i = 0; i < words.length; i++) {
if (i != 0) {
System.out.print(" ");
}
System.out.print(words[i]);
}
}
}
C++实现如下:
#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_map>
using namespace std;
string wordSort(const string& word) {
/**
* 对每个单词的字母重新按字典序排序
*/
string sorted_word = word;
sort(sorted_word.begin(), sorted_word.end());
return sorted_word;
}
string rearrangeString(const string& s) {
/**
* 对字符串s进行重新排列
*/
// 将字符串s分割成单词列表
vector<string> words;
string word;

234




被折叠的 条评论
为什么被折叠?



