DAY 1
字符串最后一个单词的长度
遇到空格重新计数
#include <iostream>
using namespace std;
int main() {
string str;
getline(cin,str);
int length=str.size();
int res=0;
for(int i=0;i<length;i++){
if(str[i]==' ') res=0;
else res++;
}
cout<<res;
}
计算某字符出现的次数
哈希表,不区分大小写字母,大写字母的ASCII码比小写字母的小32
A --65
a --97
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
string str;
getline(cin,str);
char c;
cin>>c;
unordered_map<char,int> map;
for(int i=0;i<str.size();i++){
map[str[i]]++;
}
//不区分大小写
//A->65
//a->97
if(c<='z'&&c>='a') cout<<map[c]+map[c-32];
else if(c<='Z'&&c>='A') cout<<map[c]+map[c+32];
else cout<<map[c];
}
明明的随机数
用set直接做
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main() {
int N;
cin>>N;
vector<int> nums(N);
for(int i=0;i<N;i++){
cin>>nums[i];
}
set<int> hash(nums.begin(),nums.end());
for(auto it=hash.begin();it!=hash.end();it++){
cout<<*it<<endl;
}
}
字符串分割
resize一下
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
getline(cin,str);
int length=str.size();
if(length%8==0){
int n=str.length()/8;
for(int i=0;i<n;i++){
cout<<str.substr(i*8,8)<<endl;
}
}
else{
int add=8-length%8;
str.resize(length+add, '0');
int n=str.length()/8;
for(int i=0;i<n;i++){
cout<<str.substr(i*8,8)<<endl;
}
}
}
进制转换
次方函数pow在cmath头文件里
#include <cmath>
#include <iostream>
using namespace std;
int main() {
string str;
cin>>str;
int sum=0,pos=0;
for(int i=str.size()-1;i>=2;i--){
if(str[i]>='0'&&str[i]<='9'){
int size=(str[i]-'0')*pow(16, pos);
sum+=size;
}
else{
int size=(str[i]-'A'+10)*pow(16, pos);
sum+=size;
}
pos++;
}
cout<<sum;
}
6.质数因子
一个整形n,如果在[2,sqrt(n)]之间能被质因子整除则输出该质因子,不要忘了n/=i和最后的余数n。
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin>>n;
if(n==1) cout<<n;
vector<int> nums;
for(int i=2;i<=sqrt(n);i++){
while(n%i==0){
nums.push_back(i);
n/=i;
}
}
if(n!=1) nums.push_back(n);
for(int i=0;i<nums.size()-1;i++){
cout<<nums[i]<<' ';
}
cout<<nums[nums.size()-1];
}
7.取近似值
或者直接用四舍五入函数round 在cmath头文件里
#include <iostream>
using namespace std;
int main() {
float input;
cin>>input;
float m=input-(int)input;
if(m>=0.5) cout<<(int)input+1;
else cout<<(int)input;
}
8.合并表记录
哈希表基础
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main() {
int n;
cin>>n;
vector<vector<int>> nums(n,vector<int>(2));
for(int i=0;i<n;i++){
cin>>nums[i][0]>>nums[i][1];
}
map<int, int> map;
for(int i=0;i<n;i++){
map[nums[i][0]]+=nums[i][1];
}
for(auto & it : map){
cout<<it.first<<' '<<it.second<<endl;
}
}
9.提取不重复的数
用set去重,还有就是int与字符串之间的转换
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main() {
int n;
cin>>n;
string s=to_string(n);
string res;
set<char> set;
for(int i=s.size()-1;i>=0;i--){
char c=s[i];
if(set.find(c)!=set.end()) continue;
set.insert(c);
res.push_back(c);
}
int result=stoi(res);
cout<<result;
}
10.字符个数统计
#include <iostream>
#include <set>
using namespace std;
int main() {
string s;
cin>>s;
set<char> set;
for(char& c : s){
set.insert(c);
}
cout<<set.size();
}
11.数字颠倒
#include <any>
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
cin>>n;
string s=to_string(n);
int i=0,j=s.size()-1;
while (i<j) {
swap(s[i], s[j]);
i++;
j--;
}
cout<<s;
}
12.字符串翻转
#include <iostream>
using namespace std;
int main() {
string s;
cin>>s;
for(auto it=s.rbegin();it!=s.rend();it++){
cout<<*it;
}
}
13.句子逆序
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<string> strs;
string s;
while(cin>>s){
strs.push_back(s);
}
for(auto it=strs.rbegin();it!=strs.rend();it++){
cout<<*it<<' ';
}
}
14.字符串排序
multiset 在set头文件下,选对容器就ok
#include <iostream>
#include <set>
using namespace std;
int main() {
int n;
cin>>n;
multiset<string> set;
string s;
while(cin>>s){
set.insert(s);
}
for(auto i : set){
cout<<i<<endl;
}
}
15.求int型正整数在内存中存储1的个数
#include <iostream>
using namespace std;
int main() {
int n;
int res=1;
cin>>n;
if(n==0) {cout<<"0"; return 0;}
while(n!=1){
if(n%2==0) n/=2;
else{
res++;
n/=2;
}
}
cout<<res;
}
*16.购物单
0-1背包问题,含有主从性;只将主件当做物品,剩下的两个附件当作主件的附加状态,也就是说物品有4种状态:
只要主件/主件+附件1/主件+附件2/主件+附件1+附件2
剩下的情况就与常规0-1一样。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N,m;//总金额N ,共有m个物品
cin>>N>>m;
N/=10;//是10的倍数
int value,priority,number;
//从1开始装
vector<vector<int>> data(m+1,vector<int>(6,0));
for(int i=1;i<=m;i++){
cin>>value>>priority>>number;
//主件
if(number==0){
data[i][0]=value/10;
data[i][1]=priority;
}
//第一个附件
else if(data[number][2]==0){
data[number][2]=value/10;
data[number][3]=priority;
}
//第二个附件
else{
data[number][4]=value/10;
data[number][5]=priority;
}
}
//背包容量为j时最大满意度
//0-1背包问题 组合 先物品后背包 背包倒序
vector<int> dp(N+1,0);
for(int i=1;i<=m;i++){
for(int j=N;j>=data[i][0];j--){
//第i个物品的基本情况
//主件
int valueMaster=data[i][0];
int priorityMaster=data[i][1];
//附件1
int value1=data[i][2];
int priority1=data[i][3];
//附件2
int value2=data[i][4];
int priority2=data[i][5];
//有四种情况
//1.只选主件
if(j>=valueMaster){
dp[j]=max(dp[j],dp[j-valueMaster]+valueMaster*priorityMaster);
}
//2.主件+附件1
if(j>=valueMaster+value1){
dp[j]=max(dp[j],dp[j-valueMaster-value1]+valueMaster*priorityMaster+value1*priority1);
}
//3.主件+附件2
if(j>=valueMaster+value2){
dp[j]=max(dp[j],dp[j-valueMaster-value2]+valueMaster*priorityMaster&