1.字符串由“碎片”组成,每个碎片为单一字母所组成,如“aaabbccaddd”由碎片“aaa”“bb”“cc”“a”“ddd”组成。
输入:一个字符串
输出:按字典序输出组成字符串的碎片,每个碎片一行,相同的碎片只输出一次
输入:aaabbaccdddda
输出:
a
aaa
bb
cc
dddd
#include<bits/stdc++.h>
using namespace std;
int main(){
string str;
cin >> str;
char pre;//记录上一个字符
string tmp = "";//用来拼装碎片
vector<string> lst;
for(int i = 0; i < str.size(); i++){
if(i == 0){
pre = str[i];
tmp += str[i];
continue;
}
if(pre == str[i]){//如果当前字符与上一个字符相同,则拼装当前字符到tmp上
tmp += str[i];
}else{//如果当前字符与上一个字符不同,则一个碎片拼装结束
pre = str[i];
lst.push_back(tmp);
tmp = "";
tmp += str[i];
}
}
lst.push_back(tmp);
sort(lst.begin(),lst.end());
for(int i = 0; i < lst.size(); i++){//去除重复字符,用set也可
for(int j = i+1; j < lst.size(); j++){
if(lst[i] == lst[j])
lst.erase(lst.begin()+i);
}
}
for(int i = 0; i < lst.size(); i++){
cout << lst[i] << endl;
}
return 0;
}
2.求哈夫曼树的最短带权路径长度
输入:第一行为权值个数n,第二行是n个权值
输出:最短带权路径长度
输入:
4
2,4,5,7
输出:
35
输入:
4
1,1,1,1
输出:
8
key:最短带权路径长度 = 所有非叶节点权值之和
(ps:我上机的时候是建树做的,也能写完,但是太麻烦了)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> w;
for(int i = 0; i < n; i++){
int tmp;
scanf("%d,", &tmp);
w.push_back(tmp);
}
sort(w.begin(), w.end());
int sum = 0;
while(w.size() != 1){
sum += (w[0] + w[1]);
w.push_back(w[0]+w[1]);
w.erase(w.begin());
w.erase(w.begin());
sort(w.begin(), w.end()); //使用sort复杂度为O(n*logn),可以用一轮选择排序插入新元素,时间复杂度为O(n)
//复试的时候不在乎时间复杂度,也不看代码,只看结果,怎么简单怎么写
}
cout << sum << endl;
return 0;
}