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

本文介绍了C++中处理字符串的多种实用技巧,包括字符串截取、ASCII码值应用、字符串数组操作、字符串比较等,通过具体习题示例加深理解。

一.常见知识点

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

# (一)计算列表中所有元素的乘积 # 题目:编写一个函数,计算列表中所有元素的乘积。 # 示例: # 输入: [1, 2, 3, 4] # 输出: 24 # # 要求: # 1、使用循环实现(3分) # 2、时间复杂度O(n),空间复杂度O(1)(2分) def ji(alist): s = 1 for i in alist: s *= i print(s) alist = [1, 2, 3, 4] ji(alist) # (二)斐波那契数列 # 题目:编写一个函数,计算第n个斐波那契数。 # # 要求: # 3、使用递归实现(3分) # 4、时间复杂度O(n),空间复杂度O(1)(2分) def dg(n): if n == 1 or n == 2 : return 1 else: return dg(n-1) + dg(n-2) print(dg(5)) # (三)四位玫瑰数 # 题目:已知一个四位数,各个位置上数字的四次方之和等于这个数字本身。 # # 要求: # 5、求出所有的四位玫瑰数(3分) # 6、时间复杂度O(n),空间复杂度O(1)(2分) def mg(n): gw = n % 10 sw = n % 100 // 10 bw = n % 1000 // 100 qw = n // 1000 if gw ** 4 + sw ** 4 + bw ** 4 + qw ** 4 == n : return True else: return False for i in range(1000,10000): v = mg(i) if v == True: print(f"{i}是玫瑰数") # 二、函数基础(每题5分,共85分) # (1)自定义无参无返函数,调用函数可打印出20以内的所有数字(5分) def fun1(): print([i for i in range(21)]) fun1() # (2)自定义无参有返函数,函数内可返回所输入的任意值(5分) def fun2(): return input("输入任意值:") print(fun2()) # (3)自定义有参无返函数,参数n接收一个正整数,函数内可输出该数字的3次方(5分) def fun3(n): print(n ** 3) fun3(4) # (4)自定义有参有返函数,参数a和b,函数内可返回 a + b 的结果,注意,a与b数据和类型要使用正确(5分) def fun4(a,b): return a + b print(fun4(6,4)) # (5)自定义函数,参数n1和n2,其中n2默认值为2,调用该函数可输出n1的平方,注意,2个参数都要参与运算(5分) def fun5(n1,n2 = 2): print(n1 ** n2) fun5(5,2) # (6)定义函数get_len,参数为非关键字可变长参数,接收任意个任意长度的字符串,该函数可以找出其中所有长度大于5的字符串(5分) def get_len(*args): for i in args: if len(i) > 5 : print(i) get_len("hgfjghkk","yuyu","123456") # (7)定义函数get_price,参数为关键字可变长参数,该函数可计算所有价格的总和,利用get_price(byd=99800,bmw=339800,benci=449800,audi=299800)调用测试(5分) def get_price(**kwargs): s = 0 for i,j in kwargs.items(): s += j return s ss = get_price(byd=99800,bmw=339800,benci=449800,audi=299800) print(ss) # (8)定义函数my_fun1,参数n接收任意一个字符串,调用可输出其中的所有数字字符串(5分) def my_fun1(n): for i in n: if i.isdigit(): print(i) my_fun1("fghjk1234") # (9)定义函数my_fun2,参数n接收任意一个数字列表,调用可返回该列表的升序形式(5分) def my_fun2(n): return sorted(n,) blist = my_fun2([9,8,7,4,5,6,]) print(blist) # (10)定义函数my_fun3,参数a,b,c,分别接收三个整数,调用可计算三个数字的乘积(5分) def my_fun3(a,b,c): print(a * b * c) my_fun3(2,3,4) # (11)定义函数my_fun4,参数s1,s2,分别接收2个任意集合,调用可返回2个集合的交集和并集(5分) def my_fun4(s1,s2): jj = s1 & s2 bj = s1 | s2 print(f"{jj},{bj}") my_fun4({1,2},{2,3}) # (12)使用递归函数求5的累加和(5分) def dg_he(n): if n == 1 : return 1 else: return n + dg_he(n-1) print(dg_he(5)) # (13)定义匿名函数,参数n,m,分别接收2个字符串,调用可返回n + m的结果,字符串自由定义(5分) nm1 = (lambda n,m : n + m)("hj","ui") print(nm1) # (14)使用递归函数求20-50的累加和(5分) def dg_4(n): if n == 20 : return 20 else: return n + dg_4(n-1) print(dg_4(50)) # (15)已知专业一有55名同学,专业二比专业一少4人,专业三比专业二少4人,以此类推,问,专业5有多少人,使用递归完成(5分) def dg_5(n): if n == 1 : return 55 else: return dg_5(n-1) - 4 print(dg_5(5)) # (16)自定义函数,打印一个由 * 组成的七行八列矩形(5分) def juxing(hang,lie): for i in range(1,hang + 1): for j in range(1,lie + 1): print("*",end="") print("") juxing(7,8) # (17)自定义函数,其内部封装一个计算器的代码块,该函数用有三个参数num1,num2,fh,其中num1和num2接收整数,fh接收四则运算符号,根据所接收的符号计算num1与num2的运算结果(5分) def jisuan(num1,num2,fh): if fh == "+": return num1 + num2 elif fh == "-": return num1 - num2 elif fh == "*": return num1 * num2 elif fh == "/": if num2 != 0 : return num1 / num2 else: return "算法错误" print(jisuan(5, 4, "*"))
最新发布
08-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值