数据结构算法设计题 - 串、数组和广义表(习题1-6)

本文介绍了C++编程中涉及字符串处理的一系列练习,包括字符频度统计、字符串逆序存储、插入字符串、两端对齐的字符串、互不相同的元素以及重排正数和负数的算法实现。通过这些练习,读者可以深入理解C++中字符串和数组的基本操作及其在实际问题中的应用。
摘要由CSDN通过智能技术生成

 """
original author: jacky Li
Email : 3435673055@qq.com
Last edited: 2022.11.11

"""

7b0889d8347447e6a75460c9ebbc3fc9.jpeg

目录

算法设计题 - 串、数组和广义表(习题1-6)

第1关:字符的频度

任务描述

编程要求

测试说明

参考代码如下

第2关:字符串逆序存储

任务描述

编程要求

测试说明

参考代码如下

第3关:插入字符串

任务描述

编程要求

测试说明

参考代码如下

第4关:两端对齐的字符串

编程要求

测试说明

参考代码如下

第5关:互不相同的元素

任务描述

编程要求

测试说明

参考代码如下

第6关:重排正数和负数

任务描述

编程要求

测试说明

参考代码如下


 

算法设计题 - 串、数组和广义表(习题1-6)

第1关:字符的频度

任务描述

本关任务:统计在输入字符串中各个不同字符出现的频度(字符串中合法字符为A~Z这26个字母和0~9这10个数字。

编程要求

根据提示并对照测试集要求,在右侧编辑器补充代码,实现所需功能。

测试说明

平台会对你编写的代码进行测试: 测试输入(共1行): LITTLE5ILOVEYOUAREYOUOKNUMB90077 预期输出:

数字0的个数=2

数字5的个数=1

数字7的个数=2

数字9的个数=1

字母字符A的个数=1

字母字符B的个数=1

字母字符E的个数=3

字母字符I的个数=2

字母字符K的个数=1

字母字符L的个数=3

字母字符M的个数=1

字母字符N的个数=1

字母字符O的个数=4

字母字符R的个数=1

字母字符T的个数=2

字母字符U的个数=3

字母字符V的个数=1

字母字符Y的个数=2

开始你的任务吧,祝你成功!

 

参考代码如下

#include<iostream>
using namespace std;

void Count()
{
	int num[36];
	char ch;
	int i;
	for (i = 0; i < 36; i++) num[i] = 0;
	
	while ((ch=getchar())!='\n')
		if(ch >= '0' && ch <=  '9') num[ch - 48] ++; 
		else num[ch - 55] ++;
		
	for ( i = 0; i < 10; i++)
		if(num[i] != 0) 
			cout << "数字" << i  << "的个数=" << num[i] << endl; 
			
	for (i = 10; i < 36; i++)
		if(num[i] != 0)
			cout << "字母字符" << (char)(i + 55) << "的个数=" << num[i] << endl; 
}
int main()
{
    Count();
    return 0;
}

第2关:字符串逆序存储

任务描述

本关任务:设计一个递归算法来实现字符串的逆序存储,要求不另设串存储空间。

编程要求

根据提示并对照测试集要求,在右侧编辑器补充代码,实现所需功能。

测试说明

平台会对你编写的代码进行测试:

测试输入:ABCDE12345.; 预期输出: 5-->4-->3-->2-->1-->E-->D-->C-->B-->A

开始你的任务吧,祝你成功!

参考代码如下

#include<iostream>
#include<cstring>
#define MAXSIZE 255
using namespace std;

void Inverse(char A[])
{
	static int i = 0;
	char ch; cin >> ch;
	if (ch != '.')
	{
		Inverse(A);
		A[i ++] = ch;
	}
	A[i] = '\0';
}

void Print(char A[])	
{
	cout<<A[0]; 
	int t = strlen(A);
	for (int i = 1; i < t; i++)
		cout << "-->" << A[i];
	cout << endl;
}

int main()
{
	char Arr[MAXSIZE];
	Inverse(Arr);
	Print(Arr);
	return 0;
}

第3关:插入字符串

任务描述

本关任务:实现下面函数的功能。函数Void Insert(char*s, char*t, int pos)将字符串t插入到字符串s中,插入位置为pos。假设分配给字符串s的空间足够让字符串t插入。(说明:不得使用任何库函数。)

编程要求

根据提示并对照测试集要求,在右侧编辑器补充代码,实现所需功能。

测试说明

平台会对你编写的代码进行测试:

测试输入(共三行,第一行为被插入字符串s;第二行为待插入字符串t;第三行为插入位置pos(整型数):

ABCDEFGHIJK 1234 3

预期输出: A-->B-->1-->2-->3-->4-->C-->D-->E-->F-->G-->H-->I-->J-->K


开始你的任务吧,祝你成功!

参考代码如下

#include<iostream>
#include<cstring>
#define MAXSIZE 255
using namespace std;

int j;

void Insert(char* s, char* t, int pos)
{
	int flag = 0, temp = 0;
	while(s[flag]!='\0') flag++;
	while(t[temp]!='\0') temp++;
	
	if(pos<0)
	{
	    cout<<"pos参数位置非法";
	    exit(0);
	}
	
	else if(pos>=0 && pos<=flag-1)
	{
		for(int i=flag;i>=pos;i--)
	  		s[i+temp]=s[i];
	
		for(int i=pos;i<=temp+pos-1;i++)
	    	s[i] = t[j ++];
	}
	
	else
	{
	    cout<<"位置大于字符串s的长度";
	    exit(0);
	}
}

void Print(char s[])
{
	cout << s[0];
	int t = strlen(s);
	for (int i = 1; i < t; i++)
		cout  << "-->"<< s[i];
	cout << endl;
}

int main()
{
	char str[MAXSIZE]; cin >> str;
	char trr[MAXSIZE]; cin >> trr;
    int pos = 3; cin >> pos;
	Insert(str, trr, pos - 1);
	Print(str);
	return 0;
}

 

第4关:两端对齐的字符串

编程要求

根据提示并对照测试集要求,在右侧编辑器补充代码,实现所需功能。

测试说明

平台会对你编写的代码进行测试:

测试输入(共2行,第1行为字符串s1;第2行为整型数n):

Good afternoon! Dear frienfs!

10

预期输出:

字符串s2: G-->o-->o-->d--> -->a-->f-->t-->e-->r

字符串s3: n-->o-->o-->n-->!--> -->D-->e-->a-->r--> -->f-->r-->i-->e-->n-->f-->s-->!


开始你的任务吧,祝你成功!

参考代码如下

#include<iostream>
#include<cstring>
#define MAXSIZE 255
using namespace std;
int j;
void Format(char* s1, char* s2, char* s3, int n)
{
    char *p, *q; 
    p = s1, q = s2;
    while(*p != '\0' && *p == ' ') p ++;
    if(*p == '\0')
    {
        cout<<"字符串s1为空串或空格串"<<endl;
        exit(0);
    } 
    int i = 0;
    while(*p!='\0'&&i<n)
        *q = *p, q++, p ++, i ++;
    p --, q --;
    if(*p=='\0')
    {
        cout<<"字符串s1没有"<<n<<"个有效字符"<<endl;
        exit(0);
    }
    if(*q==' ')
        while(*p == ' '&&*p != '\0')
        	p ++, *q = *p;
    *(++q)='\0', q=s3, p++;
    while(*p != '\0')
        *q = *p, q ++, p ++;
    *q='\0';
}

void Print(char s[])
{
	cout << s[0];
	int t = strlen(s);
	for (int i = 1; i < t; i++)
		cout  << "-->"<< s[i];
	cout << endl;
}

int main()
{
    
    char s1[MAXSIZE];
    cin.getline(s1,MAXSIZE);
    char s2[MAXSIZE], s3[MAXSIZE];
    int n; cin >> n;
    Format(s1, s2, s3, n);
    cout << "字符串s2:" << endl;
    Print(s2);
    cout << "字符串s3:" << endl;
    Print(s3);
    return 0;
}

第5关:互不相同的元素

任务描述

本关任务:二维数组a[1..m, 1..n]含有m×n个整数,写一个算法判断a中所有元素是否互不相同,输出相关信息(yes/no)。

编程要求

根据提示并对照测试集要求,在右侧编辑器补充代码,实现所需功能。

测试说明

平台会对你编写的代码进行测试:

测试输入(第一行为二维数组的行数m和列数n;余下m行,每行对应二维数组中的对应行):

4 5

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

17 18 19 20

预期输出: yes


开始你的任务吧,祝你成功!

参考代码如下

#include<iostream>
#include<cstring>
using namespace std;
int IsEqual(int **a, int m, int n)
{
    int ans[n * m + 1];
    memset(ans, 0, sizeof(ans));
    
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            ans[a[i][j]]++;

    for(int i=1;i<=n*m;i++)
        if(ans[i]>=2)
        {
            cout<<"no";
            return 0;
        }
	cout<<"yes";
return 1;
}

int main()
{
    int m,n;
    cin>>m>>n;
    int **arr = new int*[m];
    for(int i=0;i <m;i++)
		arr[i] = new int[n];
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            cin>>arr[i][j];
    int a= IsEqual(arr, m, n);
    for(int i=0;i<n;i++)delete []arr[i];
    for(int i=0;i<m;i++)delete []arr;
    return 0;
}

第6关:重排正数和负数

任务描述

本关任务:在数组中存放了n个整数,编写算法将所有整数排在负数前面(要求算法的时间复杂度为O(n))。

编程要求

根据提示并对照测试集要求,在右侧编辑器补充代码,实现所需功能。

测试说明

平台会对你编写的代码进行测试:

测试输入(共2行,第1行为数组中元素的个数n;第2行为以空格分隔的数组各元素):

13

1 3 -1 -2 8 9 -7 5 -1 2 6 -7 -2

预期输出:

1-->3-->6-->2-->8-->9-->5-->-7-->-1-->-2-->-1-->-7-->-2


开始你的任务吧,祝你成功!

参考代码如下

#include<iostream>
#include<algorithm>
using namespace std;

void Partition(int A[], int n)
{
	int i = 0, j = n - 1;

	while(j>=i)
	{
    	if(A[i]<0&&A[j]>0)
    	{
			swap(A[i],A[j]);
        	i++, j--;
    	}
    	if(A[i] < 0 && A[j] < 0) j --;
    	if(A[i] > 0) i ++;
	}
}

void Print(int A[], int length)
{
    cout << A[0];
    for (int i = 1; i < length; i++)
        cout << "-->" << A[i];
    cout << endl;
}

int main()
{
    int n; cin >> n;
    int *arr = new int[n];
    for(int i = 0; i < n; i ++)
        cin >> arr[i];
    Partition(arr, n);
    Print(arr, n);
    delete[] arr;
    return 0;
}

 

如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羁旅少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值