字符串汇总-HJ14 字符串排序0627

一.常见知识点

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()字符串赋值函数;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值