1.计算字符串最后一个单词的长度,单词以空格隔开。
【思路一】:倒着结算,从结束符开始,到下一个空格为止,就是最后一个单词的长度,但要考虑以空格为结尾的特殊情况
#include <iostream>
#include <string>using namespace std;
int main()
{
string s;
while(getline(cin,s))
{
int count =0;
bool flag =true;
for(int i = s.length()-1;i>=0;--i)
{
if(flag&&s[i]==' ')
{
continue;
}
else if(s[i]!=' ')
{
flag = false;
count++;
}
else
{
break;
}
}
cout <<count<<endl;
}
}
【思路二】:利用cin函数的特性,遇见空格结束,会记录最后一个单词
#include<iostream>
#include<string>
using
namespace
std;
int
main(){
string str;
while
(cin>>str);
cout<<str.size()<<endl;
return
0;
}
2.写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
【思路一】:转换大小写后,循环遍历挨个字符比较
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
char c;
cin>>s;
cin>>c;
int count =0;
for(int i=0;i<s.length()-1;i++)
{
if(toupper(s[i])==toupper(c))
{
count++;
}
}
cout <<count<<endl;
}
【思路二】:用STL标准模板库中算法count函数,还是需要先转换大小写
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
char c;
cin >> s;
cin >> c;
_strupr_s(((char *)s.c_str()),s.length()+1);
c = toupper(c);
cout << (count(s.begin(), s.end(), c)) << endl;
}
3.明明的随机数
【思路一】:利用STL中的容器和算法,一种是vector排序加unique去重,另一种直接用set容器去重
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main()
{
int N = 0;
while(cin>>N)
{
vector<int> array;
while(N>0)
{
int tempNumber = 0;
cin>>tempNumber;
array.push_back(tempNumber);
N--;
}sort(array.begin(),array.end());
vector<int>::iterator iter;
iter = unique(array.begin(),array.end());
if(iter!=array.end())
{
array.erase(iter,array.end());
}
for(iter=array.begin();iter!=array.end();iter++)
{
cout<<*iter<<endl;
}
}
//set集合的方法
#include<iostream>
#include<set>
using
namespace
std;
int
main(){
int
loop = 0;
while
(cin >> loop)
//看题目,set容器
{
int
a[1000], tem, i = 0;
for
(
int
i = 0; i < loop; i++) cin >> a[i];
set<
int
> num(a, a + loop);
for
(set<
int
>::iterator it = num.begin(); it != num.end(); it++){
cout << *it << endl;
}
}
return
0;
}
【思路二】:用桶排序的思想,为每个不重复的元素建立一个桶,然后按顺序输出
#include <iostream>
using namespace std;
int
main() {
int
N, n;
while
(cin >> N) {
int
a[
1001
] = {
0
};
while
(N--) {
cin >> n;
a[n] =
1
;
}
for
(
int
i =
0
; i <
1001
; i++)
if
(a[i])
cout << i << endl;
}
return
0
;
}
4.字符串分割
【思路一】:先把字符串补齐为8的倍数,再每8个输出一次
#include <iostream>
#include <string>
using namespace std;
void dealString(string &s)
{
if(!s.empty())
{
if(s.length()%8)
{
s.append(8-s.length()%8,'0');
}
while(s.length()>=8)
{
cout<<s.substr(0,8)<<endl;
s=s.substr(8);
}
}
}int main()
{
string str1,str2;
cin>>str1>>str2;
dealString(str1);
dealString(str2);
}
【思路二】:递归流(下面是某位大神的代码,函数名的风格别具一格,仅供参考)
#include <iostream>
#include <string>
using
namespace
std;
void
***(string str) {
if
(str ==
""
)
return
;
if
(str.size() <= 8) {
str.append(8 - str.size(),
'0'
);
cout << str << endl;
return
;
}
cout << str.substr(0, 8) << endl;
***(str.substr(8, str.size()));
}
int
main() {
string str1, str2;
cin >> str1 >> str2;
***(str1);
***(str2);
return
0;
}
5.进制转化
【思路】:用C语言的格式转换,或者C++字符流转换
#include <stdio.h>
int
main(){
int
a;
while
(
scanf
(
"%x"
, &a) != EOF){
printf
(
"%d\n"
, a);
}
return
0;
}
#include <iostream>
using namespace std;
int main()
{
int a;
while(cin>>hex>>a)
{
cout <<a<<endl;
}
}
6.质数因子
#include <iostream>
#include <string>
using namespace std;
int main()
{
long a;
while(cin>>a)
{
int divisor = 2;
if(a ==1)
{
cout <<"1"<<endl;
}
while(a!=1)
{
if(a%divisor==0)
{
a=a/divisor;
cout <<divisor<<" ";
}
else
{
++divisor;
}
}
}
}
7.取近似值
#include <math.h>
using namespace std;
int main()
{
float a;
cin>>a;
//方法一
//cout <<int(a+0.5)<<endl;
//方法二
//cout<<round(a)<<endl;
//方法三
int tmp = int(a);
if(a-tmp>=0.5)
{
cout <<tmp+1<<endl;
}
else
{
cout <<tmp<<endl;
}
}
8.合并表记录
【思路】:键值对,很容易想到C++STL里的关联容器map;如果自己写的话,需要先定义类似pair这样的数据结构
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,int> dataTable;
int key=0,value=0,N=0;
cin>>N;
while(N--&&cin>>key>>value)
{
dataTable[key]+=value;
}
for(map<int,int>::iterator iter=dataTable.begin();iter!=dataTable.end();iter++)
{
cout <<iter->first<<" "<<iter->second<<endl;
}
}
9.提取不重复的数
【思路一】:主要去重后还要保持顺序一致性,这里先求余得到逆序,然后建立10个标记,如果存在标记,则跳过重复数字输出
#include <iostream>
using namespace std;
int main()
{
int a;
while(cin>>a)
{
int array[10]={0};
while(a)
{
if(array[a%10]==0)
{
array[a%10]++;
cout<<a%10;
}
a=a/10;
}
cout<<endl;
}
return 0;
}
【思路二】:当作字符串处理,用find函数 发现重复则跳过输出
#include<iostream>
using
namespace
std;
int
main()
{
string str;
string str1=
""
;
cin>>str;
for
(
int
i=str.length()-1;i>=0;i--)
{
if
(str1.find(str[i])==string::npos)
str1+=str[i];
}
cout<<str1<<endl;
return
0;
}
10.字符个数统计
【思路一】:建一个标记数组,最后统计(适用于统计范围不大情况)
#include <iostream>
using namespace std;
int main()
{
int array[128]={0};
int result=0;
char c;
while(cin>>c)
{
array[c]=1;
}
for(int i=0;i<128;++i)
{
if(array[i])
{
result++;
}
}
cout<<result<<endl;
}
【思路二】:使用STL中set集合去重,输出set尺寸即可
#include<iostream>
#include<set>
using
namespace
std;
int
main()
{
char
c;
set<
char
> s;
while
(cin>>c){
if
(c>=0 && c<=127){
s.insert(c);
}
}
cout << s.size() <<endl;
}