一.常见知识点
substr (参数1,参数2[,参数3]); 系统函数返回被截后的子字符串
接受2个必选参数,参数1为要截取的字符串,参数2为截取的开始位置,参数3可选,表示截取长度。
比如string strTest = ‘’Iloveyousomuch”
strTest.substr(strTest,4)为eyousomuch 默认截取后面的所有字符
二.需牢记ASCII码
ASCII码 空格的ASCII码值为32;
数字0到9的ASCII码值分别为48到57
大写字母“A”到“Z”的ASCII码值分别为65到90
小写字母“a”到“z”的ASCII码值分别为97到到122。
对于字符串的数组操作行为;
如string String = “Iloveyousomuch”;
String.length() 表示串的长度
String[i]表示第i+1个位置的字符
Strcmp()函数就是来比较2个字符串的函数; eg strcmp(串1 , 串2);
如果值大于0,则表示若字符串1的ASSCII值大于2
如果值等于0,则表示两个字符串完全相同
如果值小于0,则表示若字符串1的ASSCII值小于2
三、习题汇总
HJ4 字符串分隔
描述
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(输入多次,每个字符串长度小于100)
输出描述:
输出到长度为8的新字符串数组
代码实现
#include<iostream>
using namespace std;
int main()
{
string strString;
int count = 8;
//下面按照num值对字符串中的字符进行截取
while(cin>>strString){
while(strString.size() > count )
{
string temp = strString.substr(0.,count);
cout<<temp<<endl;
strString = strString.substr(count, strString.size()-count);
}
//根据最后一次字符串的长度进行输出,优化一下
cout<< strString;
int n = strString.size();
int contrast = count - n;
for(int i = 0 ; contrast != 0 && i < contrast ; i++)
{
cout<<"0";
}
cout<<endl;
}
return 0;
}
思路分析:先进行字符串截取,打印,在进行结余字符串的打印
华为机考HJ5 进制转换
描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
输入描述:
输入一个十六进制的数值字符串。注意:一个用例会同时有多组输入数据,请参考帖子https://www.nowcoder.com/discuss/276处理多组输入的问题。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
代码实现
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
string str;
while(cin>>str)
{
int sum = 0;
int j = str.length() -3;//理解为什么是j-3
for(int i = 2 ; i < str.length() ; i++ , j--)
{
if(str[i] >='0' && str[i] <= '9')
{
//j是16进制的指数幂,
sum += (str[i] - 48)*pow(16 , j);
}
else if(str[i] >='A' && str[i] <= 'F')
{
sum += (str[i] - 55)*pow(16, j);
}
}
cout<<sum<<endl;
}
return 0;
}
思路分析:这道题主要考查的是字符的ASCII码值;‘0’到’9’的ASCII码值是48 – 57,大写字母’A’~’Z’的ASIIC的值为 65-90 同字母小写比大写大32;字符串的数组取值
HJ6 质数因子
描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
最后一个数后面也要有空格
输入描述:输入一个long型整数
输出描述:按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。
代码实现:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int num;
cin >> num;
for(int i = 2 ; i <= sqrt(num) ; i++)
{
if(num % i == 0)
{
num /=i;
cout<<i<<" ";
i--;
}
}
cout<< num << " ";
return 0;
}
思路分解:主要是要理解所有的质数因子;有点像小时候学些的短除法;主体的思路就是从小到大找较小的因子
HJ9 提取不重复的整数
描述:输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。保证输入的整数最后一位不是0。
输入描述:输入一个int型整数
输出描述:按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
代码实现
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num ;
int a[10] = {0};
cin >> num;
while(num != 0)
{
If(a[num % 10 ] == 0)
cout<<num%10;
a[num%10]++; //妙啊
num /= 10;
}
return 0
}
思路:这个题目是要获得非重复的数,并且从反方向进行获取,那就可以用到哈希值映射;由于非重复,可以选择映射到一个初始化为0的数组中
HJ10 字符个数统计
描述:编写一个函数,计算字符串中含有的不同字符的个数。字符在ASCII码范围内(0~127,包括0和127),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串abaca而言,有a、b、c三种不同的字符,因此输出3。
输入描述:输入一行没有空格的字符串。
输出描述:输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。
代码实现
//解法一
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str;
int count , a[128];
cin >> str;
for(int i = 0 ; i < str.size ;i++)
{
a[str[i]]++;
}
for(int j = 0 ; j < a.length() ; j++)
{
if(a[j] != 0)
count++;
}
cout<<count<<endl;
return 0
}
//解法二
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
char str;
int count , a[128];
cin >> str;
while(cin >> str)
{
a[str]++;
}
for(int j = 0 ; j < a.length() ; j++)
{
if(a[j] != 0)
count++;
}
cout<<count<<endl;
return 0
}
思路:统计字符串中不相同的字符的个数;同样可以映射到一个数组中然后统计数组中不为0元素的个数
HJ13 句子逆序
描述:将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
输入描述:输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。
输出描述:得到逆序的句子
代码实现
#include<bits/stdc++.h>
#include<iostream>
int main()
{
string str;
getline(cin , str); //一串含有空格的字符串可以用getline()函数来接收;
int i = str.size() – 1;
while(str[i] == ‘ ’ && i >= 0)
i--;
while(i>= 0)
{
int j = i;
while(str[i] != ‘ ’ && i >= 0)
i--; //以上两行主要是为了得到下一个空格的位置
cout<<str.substr(i+1,j-i); //非常巧妙
while(str[i] == ‘ ’ && i >= 0)
i--;
}
return 0;
}
分析:考察的是substr()函数的使用;
HJ14 字符串排序
描述:给定n个字符串,请对n个字符串按照字典序排列。
输入描述:输入第一行为一个正整数n(1≤n≤1000),下面n行为n
个字符串(字符串长度≤100),字符串中只含有大小写字母。
输出描述:数据输出n行,输出结果为按照字典序排列的字符串
代码实现:
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main()
{
int num;
cin >> num;
char arr[num][100];
for(int i = 0 ; i < num ; i++)
cin >> arr[i];
//运用strcmp()和strcpy()函数进行排序
for(int i = 0 ; i < num-1 ; i++)
{
char temp[100];
for(int j = i+1 ; j < num ; j++)
{
if(strcmp(arr[i] , arr[j]) > 0)
{
strcpy(temp , arr[i]);
strcpy(arr[i] , arr[j]);
strcpy(arr[j] , temp);
}
}
}
for(int k = 0 ; k < num ; k++)
{
cout<<arr[k]<<endl;
}
return 0;
}
思路:主要运用到了两个函数,strcmp()字符串比较函数;strcpy()字符串赋值函数;