"""
目录
算法设计题 - 串、数组和广义表(习题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;
}
如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……