- 字符串排序:
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
其具体实现代码如下:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
string fun(string str)
{
vector<char> vv;
for(int i =0;i<26;i++ )
{
for(int j = 0;j<str.size();j++)
{
if(str[j] - 'a' == i || str[j] -'A' == i)
{
vv.push_back(str[j]);
}
}
}
for(int i=0,j=0;(i<str.size()) && (j<vv.size());i++)
{
if(str[i]>='a' && str[i]<='z' || str[i]>='A' && str[i]<='Z')
{
str[i] = vv[j++];
}
}
return str;
}
int main()
{
string ss;
while(cin>>ss)
{
cout<<fun(ss)<<endl;
}
return 0;
}
如,输入: By?e 输出: Be?y
- 字符串分割: 连续输入字符串(输出次数为N,字符串长度小于100),请按长度为8拆分每个字符串后输出到新的字符串数组,长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
首先输入一个整数n,为要输入的字符串个数。然后输入n个字符串;
其具体实现代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int num;
while(cin>>num)
{
while(num--)
{
string str;
cin>>str;
while(str.size()>8)
{
cout<<str.substr(0,8)<<endl;
str = str.substr(8);
}
while(str.size() > 0 && str.size() < 8)
{
str += '0';
}
cout<<str<<endl;
}
}
}
- 字符串匹配:分别先后输入一个短字符串和一个长字符串,判断短字符串中的所有字符是否在长字符串中全部出现,返回结果为true或false;
其具体实现代码如下:
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
string str1,str2,rst;
while(cin>>str1>>str2)
{
if(str1.size()<=str2.size())
{
map<char,int> mp;
rst = "true";
for(int i = 0;i<str2.size();i++)
{
mp[str2[i]]=1;
}
for(int j= 0;j<str1.size();j++)
{
if(mp[str1[j]] != 1)
{
rst = "false";
break;
}
}
}
else
{
rst = "false";
break;
}
cout<<rst<<endl;
}
return 0;
}
- 统计大写字母:输入一个String数据,找出给定字符串中大写字符(即’A’-‘Z’)的个数
其具体实现代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
while(cin>>str)
{
int sum = 0;
for(int i=0;i<str.size();i++)
{
if(str[i]-'A' >=0 && str[i]-'A' <=25)
{
sum = sum+1;
}
}
cout<<sum<<endl;
}
return 0;
}
- 删除字符串中出现次数最少的字符:实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
注意每个输入文件有多组输入,即多个字符串用回车隔开;
其具体实现代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string fun(string str)
{
string left_str;
int account[26]={0};
int min = 1000;
for(int i=0;i<str.size();i++) //将输入字符串中是小写字母的字符找出
{
if(str[i]-'a'>=0 && str[i]-'a'<=25)
{
account[str[i]-'a']++;
}
}
for(int i=0;i<26;i++) //找出出现次数最少的字符
{
if(account[i]<min && account[i] !=0)
{
min = account[i];
}
}
for(int i=0;i<str.size();i++) //将输入字符串中出现次数最少的字符踢出,将余下的字符按输入时顺序输出
{
if(account[str[i]-'a']>min)
{
left_str+=str[i];
}
}
return left_str;
}
int main()
{
string ss;
while(cin>>ss)
{
cout<<fun(ss)<<endl;
}
return 0;
}
- 在字符串中找出连续最长的数字串:输入一个字符串,输出字符串中最长的数字字符串和它的长度,中间用逗号间隔。如果有相同长度的串,则要一块儿输出(中间不间隔),但是长度还是一串的长度,与数字字符串间用逗号间隔。
其具体实现代码如下:
c++编程实现:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
while(cin>>str)
{
if(str == "")
{cout<<" "<<endl;}
else
{
int i=0,j=0,max=0,num=0;
int len = str.size();
for(i=0;i<len;i++)
{
if(str[i]-'0'>=0 && str[i]-'0'<=9) num++;
else num = 0;
if(num > max) max = num;
}
if(max == 0) cout<<" "<<endl;
num = 0;
for(i=0;i<len;i++)
{
if(str[i]-'0'>=0 && str[i]-'0'<=9) num++;
else num = 0;
if(num == max)
{
for(j = i-max+1;j<=i;j++)
{
cout<<str[j];
}
}
}
cout<<","<<max<<endl;
}
}
return 0;
}
c语言编程实现:
#include<stdio.h>
#include<string.h>
int main(void)
{
char cc[1000];
while(scanf("%s",cc) != EOF)
{
int i=0,j=0,max=0,num = 0;
int len = strlen(cc);
for(int i=0;i<len;i++)
{
if(cc[i] >= '0' && cc[i] <= '9')num++;
else num = 0;
if(num>max)
{
max = num;
}
}
num = 0;
for(int i=0;i<len;i++)
{
if(cc[i] >= '0' && cc[i] <= '9')num++;
else num = 0;
if(num == max)
for(j=i-max+1;j<=i;j++) printf("%c",cc[j]);
}
printf(",%d\n",max);
}
return 0;
}
- 统计字符:输入一行字符串,可以有空格,分别统计出包含英文字母、空格、数字和其它字符的个数;
其具体实现的代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
while(getline(cin,str))
{
int n1=0,n2=0,n3=0,qt=0;
int len = str.size();
for(int i = 0;i<len;i++)
{
if((str[i]-'a'>=0 && str[i]-'a'<=25) || (str[i]-'A'>=0 && str[i]-'A'<=25)) n1++;
else if(str[i] == ' ') n2++;
else if(str[i]>='0' && str[i]<='9') n3++;
else qt++;
}
cout<<n1<<endl<<n2<<endl<<n3<<endl<<qt<<endl;
}
return 0;
}
- 截取字符串:输入一个字符串和一个整数k,截取字符串的前k个字符并输出,第一行输入待截取的字符串,第二行输入一个正整数k,代表截取的长度,输出截取后的字符串;
其具体是是实现的代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str,s1;
int k;
while(cin>>str>>k)
{
s1= str.substr(0,k);
cout<<s1<<endl;
}
return 0;
}
- 表示数字:输入一个字符串,将该字符中所有出现的数字前后加上符号“*”,其他字符保持不变输出;
其具体实现的代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
while(cin>>str)
{
string ss ="";
int len = str.size();
for(int i= 0;i<len;i++)
{
if(str[i]>='0' && str[i]<='9') {ss+=str[i];}
else
{
if(ss =="") {cout<<str[i];}
else if(ss !="")
{
cout<<"*"<<ss<<"*"<<str[i];
ss = "";
}
}
}
if(ss !="") { cout<<"*"<<ss<<"*";} //当输入的字符都是数字时
cout<<endl;
}
return 0;
}
10.图片整理:Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好,Lily使用的图片包括"A"到"Z"、“a"到"z”、“0"到"9”。输入字母或数字个数不超过1024,Lily的所有图片按照从小到大的顺序输出;
其具体实现代码如下:
C++代码实现
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string str;
while(getline(cin,str))
{
sort(str.begin(),str.end());
cout<<str<<endl;
}
return 0;
}
C语言代码实现
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void* a,const void* b)
{
return *(char*)a-*(char*)b;
}
int main(void)
{
char cc[1024]={0};
while(scanf("%s",cc) != EOF)
{
int len = strlen(cc);
qsort(cc,len, sizeof(char),cmp);
for(int i = 0;i<len;i++)
{
printf("%c",cc[i]);
}
printf("\n");
}
return 0;
}
- 找出字符串中第一个只出现一次的字符:输入几个非空字符串,输出第一个只出现一次的字符,如果不存在输出-1;
其具体实现代码如下:
#include<iostream>
#include<string>
using namespace std;
void fun(string ss)
{
int len = ss.size();
int count[128] = {0};
char s;
for(int i = 0;i<len;i++)
{
count[ss[i]]+=1;
}
int flag = 0;
for(int i = 0;i<len;i++)
{
if(count[ss[i]]==1)
{
s = ss[i];
cout<<s<<endl;
flag = 1;
break;
}
}
if(flag == 0)
{
cout<<"-1"<<endl;
}
}
int main()
{
string str1;
string str2;
while(cin>>str1>>str2)
{
fun(str1);
fun(str2);
}
return 0;
}
- 单词倒排:对字符串中的所有单词进行倒排,说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
输入一行以空格来分割的句子,输出句子的倒序;
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void fun(string str)
{
vector <string> vc;
int len = str.size();
int sublen = 0;
for(int i = 0;i < len;i++)
{
if(str[i]>='a' && str[i]<='z'|| str[i]>='A' && str[i]<='Z')
{
sublen ++;
continue;
}
else
{
if(sublen > 0)
{
vc.push_back(str.substr(i-sublen,sublen));
sublen = 0;
}
}
}
if(sublen > 0)
{
vc.push_back(str.substr(len-sublen,sublen));
}
for(int i = vc.size()-1;i>0;i--) cout<<vc[i]<<' ';
cout<<vc[0]<<endl;
}
int main()
{
string ss;
while(getline(cin,ss))
{
fun(ss);
}
return 0;
}
- 简单密码:假设渊子原来一个BBS上的密码为zvbo9441987,为了方便记忆,他通过一种算法把这个密码变换成YUANzhi1987,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。他是这么变换的,大家都知道手机上的字母: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,
声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:X,先变成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾,输出渊子真正的密文;
其具体实现的代码如下:
#include<iostream>
#include<string>
using namespace std;
void fun(string str)
{
int len = str.size();
string ss="";
for(int i=0;i<len;i++)
{
if(str[i]=='Z')
{
str[i]= 'a';
ss+=str[i];
}
else if(str[i]>='A' && str[i]<'Z')
{
str[i]+=33;
ss+=str[i];
}
else if(str[i]>='a' && str[i]<='z')
{
if(str[i]=='a' || str[i]=='b' || str[i]=='c') str[i] = '2';
else if(str[i]=='d' || str[i]=='e' || str[i]=='f') str[i] = '3';
else if(str[i]=='g' || str[i]=='h' || str[i]=='i') str[i] = '4';
else if(str[i]=='j' || str[i]=='k' || str[i]=='l') str[i] = '5';
else if(str[i]=='m' || str[i]=='n' || str[i]=='o') str[i] = '6';
else if(str[i]=='p' || str[i]=='q' || str[i]=='r' || str[i]=='s') str[i] = '7';
else if(str[i]=='t' || str[i]=='u' || str[i]=='v') str[i] = '8';
else if(str[i]=='w' || str[i]=='x' || str[i]=='y' || str[i]=='z') str[i] = '9';
ss+=str[i];
}
else {ss+=str[i];}
}
cout<<ss<<endl;
}
int main()
{
string ss;
while(getline(cin,ss))
{
fun(ss);
}
return 0;
}
- 字符串加解密:
描述如下:
1、对输入的字符串进行加解密,并输出。
2、加密方法为:当内容是英文字母时则用该英文字母的后一个字母替换,同 时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;其他字符不做变化。
3、解密方法为加密的逆过程;
输入一串要加密的密码和一串加过密的密码,分别输出加密后的字符和解密后的字符;
其具体实现代码如下:
#include<iostream>
#include<string>
using namespace std;
void fun1(string str1)
{
int len1 = str1.size();
string s1 = "";
for(int i= 0;i<len1;i++)
{
if(str1[i]=='9')
{
str1[i] = '0';
s1+=str1[i];
}
else if(str1[i]>='0' && str1[i]<'9')
{
str1[i]=str1[i]+1;
s1+=str1[i];
}
else if(str1[i]=='z')
{
str1[i] = 'A';
s1+=str1[i];
}
else if(str1[i]=='Z')
{
str1[i] = 'a';
s1+=str1[i];
}
else if(str1[i]>='a' && str1[i]<'z')
{
str1[i]=str1[i]-31;
s1+=str1[i];
}
else if(str1[i]>='A' && str1[i]<'Z')
{
str1[i]=str1[i]+33;
s1+=str1[i];
}
}
cout<<s1<<endl;
}
void fun2(string str2)
{
int len2 = str2.size();
string s2 = "";
for(int i= 0;i<len2;i++)
{
if(str2[i]=='0')
{
str2[i] = '9';
s2+=str2[i];
}
else if(str2[i]>'0' && str2[i]<='9')
{
str2[i]=str2[i]-1;
s2+=str2[i];
}
else if(str2[i]=='A')
{
str2[i] = 'z';
s2+=str2[i];
}
else if(str2[i]=='a')
{
str2[i] = 'Z';
s2+=str2[i];
}
else if(str2[i]>'a' && str2[i]<='z')
{
str2[i]=str2[i]-33;
s2+=str2[i];
}
else if(str2[i]>'A' && str2[i]<='Z')
{
str2[i]=str2[i]+31;
s2+=str2[i];
}
}
cout<<s2<<endl;
}
int main()
{
string ss1;
string ss2;
while(cin>>ss1>>ss2)
{
fun1(ss1);
fun2(ss2);
}
return 0;
}
- 购物单:王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
主件 附件
电脑 打印机,扫描仪
书柜 图书
书桌 台灯,文具
工作椅 无
如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。王强想买的东西很多,为了不超出预算,他把每件物品规定了一个重要度,分为 5 等:用整数 1 ~ 5 表示,第 5 等最重要。他还从因特网上查到了每件物品的价格(都是 10 元的整数倍)。他希望在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
输入的第 1 行,为两个正整数,用一个空格隔开:N m
(其中 N ( <32000 )表示总钱数, m ( <60 )为希望购买物品的个数。)
从第 2 行到第 m+1 行,第 j 行给出了编号为 j-1 的物品的基本数据,每行有 3 个非负整数 v p q
(其中 v 表示该物品的价格( v<10000 ), p 表示该物品的重要度( 1 ~ 5 ), q 表示该物品是主件还是附件。如果 q=0 ,表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号);
输出文件只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值( <200000 )
其具体实现的代码如下:
#include<iostream>
#include<array>
#include<cmath>
using namespace std;
int dp[32000]; // 物品的价格与重要度的乘积之和
int main()
{
int N,m;
cin>>N>>m;
int zj[m+1],zj_v[m+1],fj1[m+1],fjl_v[m+1],fj2[m+1],fj2_v[m+1];
while(m>0)
{
for(int i= 1;i<=m;i++)
{
int v,p,q;
cin>>p>>v>>q;
if(q == 0)
{
zj[i] = v;
zj_v[i] = p*v;
}
else if(fj1[q] == 0) // 数组同一个索引值唯一
{
fj1[q] = v;
fjl_v[q] = p * v;
}
else if(fj2[q] == 0) // 数组同一个索引值唯一
{
fj2[q] = v;
fj2_v[q] = p * v;
}
}
for(int i= 1;i<=m;i++)
{
for(int j =N;j>0;j--)
{
dp[j] = zj_v[i];
if(j>=zj[i]){ dp[j] = max(dp[j], dp[j-zj[i]]+zj_v[i]);}
else if(j>=(zj[i]+fj1[i])) { dp[j] = max(dp[j], dp[j-zj[i]-fj1[i]]+zj_v[i]+fjl_v[i]);}
else if(j>=(zj[i]+fj2[i])) { dp[j] = max(dp[j], dp[j-zj[i]-fj2[i]]+zj_v[i]+fj2_v[i]);}
else if(j>=(zj[i]+fj1[i]+fj2[i])) { dp[j] = max(dp[j], dp[j-zj[i]-fj1[i]-fj2[i]]+zj_v[i]+fjl_v[i]+fj2_v[i]); }
}
}
cout<<dp[N]<<endl;
}
return 0;
}
- 放苹果组合问题:把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。输入两个int整数,输出一个int整数:
其具体实现代码如下:
#include<iostream>
using namespace std;
int fun(int m,int n)
{
if(m < 0 || n < 0)
{
return 0;
}
else if(m == 1 || n == 1)
{
return 1;
}
else
{
return fun(m,n-1)+(m-n<0?0:fun(m-n,n));
}
}
int main()
{
int a;
int b;
while(cin>>a>>b)
{
cout<<fun(a,b)<<endl;
}
return 0;
}
- 求解立方根
计算一个数字的立方根,不使用库函数,结果保留一位小数。
其具体实现的代码如下:
#include <iostream>
#include <iomanip>
using namespace std;
double func(double n)
{
double r = n;
double l= 0, mid = 0;
if (n < 1)
r = 1;
while ((r - l) > 1e-4)
{
mid = (r + l) / 2;
if (mid * mid * mid > n)
r = mid;
else
l = mid;
}
return l;
}
int main()
{
double n;
while (cin >> n)
{
if (n > 0)
cout << fixed << setprecision(1) << func(n) << endl;
else
cout << fixed << setprecision(1) << -func(-n) << endl;
}
return 0;
}
- 汽水瓶
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
其具体实现代码如下:
#include<iostream>
using namespace std;
int fun(int num)
{
int rst = 0;
int mid = 0;
if(num<=1 && num!=0)
{
rst+=0;
}
while(num >= 2)
{
num +=1;
mid= num/3;
num = num%3+mid-1;
rst += mid;
}
return rst;
}
int main()
{
int n;
while(cin>>n)
{
if(n!=0)
{
cout<<fun(n)<<endl;
}
}
return 0;
}
- 统计每个月的兔子总数:有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?(斐波那契定理)
其具体实现代码如下:
#include<iostream>
using namespace std;
int fun(int month)
{
int f[month];
f[1]=1;
f[2]=1;
for(int i=3;i<=month;i++)
{
f[i]=f[i-1]+f[i-2];
}
return f[month];
}
int main()
{
int m;
while(cin>>m)
{
cout<<fun(m)<<endl;
}
return 0;
}
- 四则运算:
输入一个表达式(用字符串表示),求这个表达式的值。保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。
其具体实现的代码如下:
#include <iostream>
#include <stack>
using namespace std;
int pos = 0;
int compute(string & data) //第一步
{
int len = data.length();
int num = 0;
char flag = '+';
stack<int> st;
while (pos < len)
{
if (data[pos] == '{' || data[pos] == '[' || data[pos] == '(')
{
pos++;
num = compute(data);//遇到左括号,直接递归执行第一步 num = 0
}
while (pos < len && isdigit(data[pos]))
{
num = num * 10 + data[pos] -'0';
pos++;
}
switch (flag)
{
case '+':
st.push(num); //遇到数字先压栈
break;
case '-': //遇到数字先压栈
st.push(-num);
break;
case '*':
{
int temp = st.top();
st.pop(); //先出栈
temp *= num; //和下一个进行乘运算
st.push(temp); //将运算结果压栈
break;
}
case '/':
{
int temp = st.top();
st.pop();
temp /= num;
st.push(temp);
break;
}
}
num = 0;
flag = data[pos];
if (data[pos] == '}' || data[pos] == ']'|| data[pos] == ')')
{
pos++;
break; //退出函数
}
pos++;
}
int sum = 0;
while (st.size()) {
sum += st.top(); //保证栈内所有数字都是加数,对所有加数求和
st.pop();
}
return sum;
}
int main()
{
string data;
while (cin >> data)
{
cout << compute(data) << endl;
}
return 0;
}
22.XX
23. xxxx
24. xxxx
25. xxxx
26. xxxx
27. xxx
10.XXXXx