《算法笔记》——基础篇习题数组

做题速度越来越快啦!

第二章 C/C++快速入门——2.5数组

【习题A】 有序插入

Problem Description

有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中。

假设数组长度为10,数组中前9个数(这9个数要求从键盘上输入,输入时要满足自小到大的输入顺序)已经按从小到大进行排序。

然后再从键盘上输入一个整数,将此整数插入到前有序的9个数中,使得最终的10个数依然是从小到大有序的。

Input
第一行输入以空格分隔的9个整数数,要求按从小到大的顺序输入。

第二行输入一个整数

Output
从小到大输出这10个数,每个数一行。

Sample Input
1 11 21 31 41 51 61 71 81
45

Sample Output
1
11
21
31
41
45
51
61
71
81

Thinking Notes

  • 一开始把n<a[i]的条件判断反了

  • 移动的时候要从后端开始

Code Implementation(C)

#include<stdio.h>
int main(){
    int n;
    int a[10];
    for(int i=0;i<9;i++){
        scanf("%d",&a[i]);
    }
    scanf("%d",&n);
    int k;
    for(k=0;k<9;k++){//下标0~8与n比较大小,一旦n<a[i]退出
        if(n<a[k]) break;
    }
    for(int i=8;i>=k;i--){//把从8~k的数组元素向后移动(从后端开始)
        a[i+1]=a[i];
    }
    a[k]=n;
    for(int i=0;i<10;i++){
        printf("%d\n",a[i]);
    }
    return 0;
}

【习题B】 数组元素逆置

Problem Description

将一个长度为10的整型数组中的值按逆序重新存放。

如:原来的顺序为1,2,3,4,5,6,7,8,9,0,要求改为0,9,8,7,6,5,4,3,2,1

Input
从键盘上输入以空格分隔的10个整数。

Output
按相反的顺序输出这10个数,每个数占一行。

Sample Input
1 2 3 4 5 6 7 8 9 0

Sample Output
0
9
8
7
6
5
4
3
2
1

Code Implementation(C)

#include<stdio.h>
int main(){
    int a[10];
    for(int i=0;i<10;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<5;i++){
        int t;
        t=a[i];
        a[i]=a[9-i];
        a[9-i]=t;
    }
    for(int i=0;i<10;i++){
        printf("%d\n",a[i]);
    }
    return 0;
}

【习题C】 杨辉三角

Problem Description

按要求输入如下格式的杨辉三角

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

最多输出10层

Input
输入只包含一个正整数n,表示将要输出的杨辉三角的层数。

Output
对应于该输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开

Sample Input
5

Sample Output
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

Code Implementation(C)

#include<stdio.h>
#include<string.h>
int main(){
    int a[10][10],n;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(int i=0;i<n;i++){
        for(int j=0;j<=i;j++){
            if(i==j || j==0){
                a[i][j]=1;
            }
            else{
                a[i][j]=a[i-1][j-1]+a[i-1][j];
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<=i;j++){
            printf("%d ",a[i][j]);
        } 
        printf("\n");
    }
    return 0;
}

【习题D】 解密

Problem Description

有一行电文,已按如下规律译成密码:

A–>Z a–>z

B–>Y b–>y

C–>X c–>x

… …

即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。

Input
输入一行密文

Output
解密后的原文,单独占一行。

Sample Input
ZYX123zyx

Sample Output
ABC123abc

Thinking Notes

  • 注意(26-i+1)解密公式中的i是26个字母的序号,不要与字符串的下标j混淆

  • 字母值字母序号的转换:
    (26-i+1):
    i 是字母序号,由(a[j]-‘a’)+1转换成字母值
    (26-i+1)是解密后的字母序号,由(26-i+1)+(‘a’-1)转换成字母值
    将i替换,从而得到解密后的字母值(26-(a[j]-‘a’)+1+1)+(‘a’-1)

  • 注意字母序号和字母值转换时,加减‘a’要有1的差量

Code Implementation(C)

#include <stdio.h>
#include <string.h>
int main(){
    char a[100];
    scanf("%s",a);
    for(int j=0;j<strlen(a);j++){
        if(a[j]>='a'&&a[j]<='z'){
            a[j]=26-((a[j]-'a')+1)+1+('a'-1);
        }
        else if(a[j]>='A'&&a[j]<='Z'){
            a[j]=26-((a[j]-'A')+1)+1+('A'-1);
        }
    }
    printf("%s\n",a);
    return 0;
}

【习题E】 字符串比较

Problem Description

比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数;若s1=s2,则输出0;若s1<s2,则输出一个负数。

要求:不用strcpy函数;两个字符串用gets函数读入。

例如:“A"与"C"相比,由于"A”<“C”,应输出负数,同时由于"A"与"C"的ASCII码差值为2,因此应输出"-2"。

同理:"And"和"Aid"比较,根据第2个字符比较的结果,“n"比"i"大5,因此应该输出"5”

Input
输入2行字符串

Output
一个整数,表示这两个字符串 比较的差值,单独占一行。

Sample Input
And
Aid

Sample Output
5

Thinking Notes

参考了大佬的代码,取两个字符串教短的长度遍历,一直没搞懂原因,先埋个坑日后回来填。
(max的方法 ac了)
发现用gets会编译错误,还是老老实实用scanf吧。

Code Implementation(C)

#include <stdio.h>
#include <string.h>
int main(){
    char a[20],b[20];
    scanf("%s",a);
    scanf("%s",b);
    //gets(a);
    //gets(b);
    int sum=0;
    int max=strlen(a)>strlen(b)?strlen(a):strlen(b);
    for(int i=0;i<max;i++){
        sum=sum+a[i]-b[i];
    }
    printf("%d",sum);
    return 0;
}

【习题H】冒泡排序

Problem Description

从键盘上输入10个整数,用冒泡法对这10个数进行排序(由小到大)。

Input
以空格分隔的10个整数

Output
依次输出排好序的10个整数,每个数占一行。

Sample Input
1 3 5 7 9 2 4 6 8 0

Sample Output
0
1
2
3
4
5
6
7
8
9

Code Implementation(C)

#include <stdio.h>
int main(){
    int a[10];
    for(int i=0;i<10;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<9;i++){
        for(int j=0;j<=9-i-1;j++){
            if(a[j]>a[j+1]){
                int t;
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    for(int i=0;i<10;i++){
        printf("%d\n",a[i]);
    }
    return 0;
}

【习题I】矩阵转置

Problem Description

将一个2行3列的矩阵(二维数组)行列互换,存储到另一个3行2列的矩阵中。
要求以整型数据为例来解答。

Input
输入2行数据,每行3个整数,以空格分隔。

Output
行列互换后的矩阵,3行,每行2个数据,以空格分隔。

Sample Input
1 2 3
4 5 6

Sample Output
1 4
2 5
3 6

Code Implementation(C)

#include <stdio.h>
int main(){
    int a[2][3],b[3][2];
    for(int i=0;i<2;i++){
        for(int j=0;j<3;j++){
            scanf("%d",&a[i][j]);
            b[j][i]=a[i][j];
        }
    }
    for(int i=0;i<3;i++){
        for(int j=0;j<2;j++){
            printf("%d ",b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

【习题J】字符串求最大值

Problem Description

从键盘上输入3个字符串,求出其中最大者。

Input
输入3行,每行均为一个字符串。

Output
一行,输入三个字符串中最大者。

Sample Input
England
China
America

Sample Output
England

Code Implementation(C)

#include <stdio.h>
#include <string.h>
int main(){
    char a[10],b[10],c[10];
    scanf("%s",a);
    scanf("%s",b);
    scanf("%s",c);
    if(strcmp(a,b)>0){
        if(strcmp(a,c)>0) printf("%s",a);
        else printf("%s",c);
    }
    else if(strcmp(b,a)>0){
        if(strcmp(b,c)>0) printf("%s",b);
        else printf("%s",c);
    }
    return 0;
}

大佬的用二维数组:

Code Implementation

#include <cstdio>
#include <cstring>
int main()
{
	char a[3][10];
	for(int i=0;i<3;i++)
		gets(a[i]);
	int max=0;
	for(int i=1;i<3;i++)
		if(strcmp(a[max],a[i])<=0)
			max=i;
	printf("%s",a[max]);
	return 0;
}
cda备考学习学习笔记——基础知识(二)主要涉及了计算机科学与技术领域的基本概念和知识。 首先,它介绍了计算机网络的基础知识。网络是将多台计算机通过通信链路连接起来,使它们能够相互通信和共享资源的系统。笔记中详细介绍了网络的组成、拓扑结构和通信协议等重要内容。 其次,笔记还解释了计算机系统的基本组成。计算机系统由硬件和软件两部分组成,其中硬件包括中央处理器、存储器、输入输出设备等,而软件则分为系统软件和应用软件。笔记详细介绍了各种硬件和软件的功能和作用。 此外,笔记还对数据库管理系统进行了介绍。数据库管理系统是一种用于管理和组织数据的软件系统,它能够实现数据的存储、检索和更新等操作。笔记中详细介绍了数据库的概念、结构和操作等内容。 最后,笔记还包括了算法和数据结构的基础知识。算法是解决问题的一系列步骤和规则,而数据结构则是组织和存储数据的方式。笔记中介绍了常用的算法和数据结构,如排序算法、树和图等。 总之,通过学习CDA备考学习笔记中的基础知识(二),我们能够更好地理解计算机网络、计算机系统、数据库管理系统以及算法和数据结构等相关概念和知识。这些基础知识对于我们深入研究计算机科学与技术领域是非常重要的,也为我们日后的学习和工作奠定了坚实的基础
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值