HJ1 字符串最后一个单词的长度
给两个标准做法:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
int a=0;
getline(cin, s);
for(int i=s.size()-1;s[i]!=' '&&i>=0; i--){ //注意这边是从后开始,同时注意判断语句是i在每次运行是需要达到的条件,并且从后开始的遍历,一定要注意令i>0!
a++;
}
cout<<a;
return 0 ;
}
注:getline与cin输入字符串的区别
getline经常使用在字符串的输入中,在C++zhong1除了getline输入字符串外还可以使用cin进行字符串的输入,两者的区别是用cin进行输入时遇到空格代表字符串的输入结束,而用getline进行字符串的输入时遇到换行符才会结束该字符串的输入。
————————————————
版权声明:本文为CSDN博主「柒笙歌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_72542983/article/details/128822871
HJ2 计算某字符出现次数
自己写的第一轮的代码
#include <cstdio>
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main() {
string s;
getline(cin, s);
char x;
cin>>x;
unordered_map<char, int> map;
for(int i=0; i<s.size(); i++){
auto x = map.find(s[i]);
if(x!=map.end()){
++map[s[i]];
}
else{
map.insert(pair<char,int>(s[i], 0));
}
}
cout<< map[x]<<endl;
}
复习了map的使用方式,同时对于insrt、find函数重新复习了一下。
但是依然有两点非常明显的错误:
- 既在加入的时候
map.insert(pair<char,int>(s[i], 0));
此处再加入时,该项就产生过一次,所以一定要记得对应的value值需要加上1。 - 并没有区分大小写,而在此处需要对大小写进行统一为小写!!
修改后的代码如下:
#include <cstdio>
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main() {
string s;
getline(cin, s);
char x;
cin>>x;
if(x >='A' && x<='Z')x=x-'A'+'a'; //在这边对于最后要检测的字符进行小写化处理
unordered_map<char, int> map;
for(int i=0; i<s.size(); i++){
char y=s[i];
if(y>='A' && y<='Z')y=y-'A'+'a'; //在这边对于字符串中的每个字母添加入哈希表时,都进行小写化处理。
auto x = map.find(y);
if(x!=map.end()){
++map[y]; //增加哈希表value值时可以用这个方法
}
else{
map.insert(pair<char,int>(y, 1)); //别忘了在添加元素的时候就默认为1哦!
}
}
cout<< map[x]<<endl;
}
也可以直接使用用 法: int tolower(int c);
函数来进行小写化。
HJ3 明明的随机数
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
int num_input;
cin>>num_input;
int s[501];
for(int i=0;i<501;i++){
s[i]=0;
}
for(int i=0;i<num_input;i++){
int buffer;
cin>>buffer;
s[buffer]++;
}
for(int i=0;i<501;i++){
if (s[i]!=0){cout<<i<<endl;} //endl有换行的功效
}
return 0;
}
// 64 位输出请用 printf("%lld")
还有使用哈希表的方法去做
#include<iostream>
#include<set>
using namespace std;
int main() {
int n;
while(cin>>n) { //输入每组数据的个数
set<int> order; //使用set容器可以自动实现去重和排序的操作,这里很关键
for(int i=0;i<n;i++) {
int num;
cin>>num; //输入数字
order.insert(num); //插入到容器order中
}
set<int>::iterator it; //set类型迭代器
for(it=order.begin();it!=order.end();it++){
cout<<*it<<endl; //遍历输出
}
}
return 0;
}
#include <cstdio>
#include <iostream>
#include <iterator>
#include <unordered_set>
#include<set>
using namespace std;
int main() {
int num_input;
cin>>num_input;
set<int> order;
for(int i=0;i<num_input;i++){
int buffer;
cin>>buffer;
order.insert(buffer);
}
set<int>::iterator itr;
for(itr=order.begin();itr!=order.end();itr++){
cout<<*itr<<endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
注意一定要用set而不是unordered_set,因为unordered不会自动排序,不太行。
HJ4 字符串分隔
#include <iostream>
using namespace std;
int main() {
string s;
char count=0;
string result;
getline(cin,s);
if(s.size()%8!=0)
{
int x =8-s.size()%8;
s.append(x, '0');
}
for(int i =0; i< s.size();i=i+8){
cout << s.substr(i, 8) << endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
substr(size_type _Off = 0,size_type _Count = npos)
一种构造string的方法
形式 : s.substr(pos, len)
返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos,即不加参数会默认拷贝整个s)
异常 :若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n
————————————————
版权声明:本文为CSDN博主「哦啦哦啦!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42240667/article/details/103131329
所以substr函数
即是从第i位往后切割8(len)个字符,随后作为输出。
HJ5 进制转换
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s;
int res =0;
int pos =0;
for(pos=2;pos<s.size();pos++){
int temp;
if (s[pos]>='A'&&s[pos]<='F'){
temp=10+(s[pos]-'A');
}
else {
temp=s[pos]-'0'; //在字符串运算中,无论是A还或是0、1、2,减去基准位的字符型时必不可少的。
}
res=res*16+temp;
}
cout<<res<<endl;
}