【算法笔记题解】《算法笔记知识点记录》第二章——快速入门2[选择结构、循环结构和数组](3)

简介: 【算法笔记题解】《算法笔记知识点记录》第二章——快速入门2[选择结构、循环结构和数组](3)

🍟2.5 数组

地址合集:2.5数组


问题 A: 习题6-4 有序插入

题目描述

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

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

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


输入

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

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

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


输出

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

样例输入

1 11 21 31 41 51 61 71 81

45


样例输出

1

11

21

31

41

45

51

61

71

81


解题思路


让咋咋呗。后移是为了给插入元素腾出来位置。


#include<stdio.h>
int main(){
    int a[10], i;
    for(i = 0;i < 9;++i)
        scanf("%d",&a[i]);//读入元素
    int c;
    scanf("%d",&c);
    for(i = 8;i && a[i] > c;--i){
        a[i + 1] = a[i];    //后移
    }
    a[i+1] = c;
    for(i = 0;i < 10;i++)
        printf("%d\n",a[i]);
    return 0;
}


问题 B: 习题6-5 数组元素逆置

题目描述

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

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


输入

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


输出

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


样例输入

1 2 3 4 5 6 7 8 9 0

样例输出

0

9

8

7

6

5

4

3

2

1


解题思路


倒序输出就好了啊


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


问题 C: 习题6-6 杨辉三角

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

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

最多输出10层

输入

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


输出

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


样例输入

5


样例输出

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1


解题思路


感觉是要二维数组吧?注意输出格式!


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


问题 D: 习题6-12 解密

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

A–>Z a–>z

B–>Y b–>y

C–>X c–>x

… …

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


输入

输入一行密文


输出

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

样例输入

ZYX123zyx


样例输出

ABC123abc


解题思路


典型字符串的数据啊。不用保存,读一个转一个就好。


#include<stdio.h>
int main(){
    char c;
    while((c = getchar()) != '\n' && c != '\0'){
        if(c >= 'A' && c <= 'Z'){
            putchar('Z' - c + 'A');
            continue;
        }
        else if(c >= 'a' && c <='z'){
            putchar('z' - c + 'a');
            continue;
        }
        else putchar(c);
    }
    return 0;
}


问题 E: 习题6-13 字符串比较

比较两个字符串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”


输入

输入2行字符串


输出

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


样例输入

And

Aid


样例输出

5


解题思路


需要读入一行,所以用了cin.getline,注意头文件和namespace


#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
    char str1[100],str2[100];
    cin.getline(str1,100);
    cin.getline(str2,100);
    int i;
    for(i = 0 ;str1[i] || str2[i];i++){
        if(str1[i] > 'a')   str1[i] -= 32;  //都变成大写
        if(str2[i] > 'a')   str2[i] -= 32;//都变成大写
        if(str1[i] == '\0'){
            printf("%d\n",0 - str2[i]);
            break;
        }
        if(str2[i] == '\0'){
            printf("%d\n",str1[i] - 0);
            break;
        }
        if(str1[i] == str2[i])  continue;
        else {
            printf("%d\n",str1[i] - str2[i]);
            break;
        }
    }
    if(str1[i] == 0 && str2[i] == 0) printf("%d\n",0);
    return 0;
}

问题 F: 例题6-1 逆序输出数组元素

从键盘上输入10个整数,存储在一个长度为10的整型数组中,要求将输入的10个数逆序输出。

如输入为:0,1,2,3,4,5,6,7,8,9 输出为9,8,7,6,5,4,3,2,1,0


输入

10个整数,以空格分隔


输出

将输入的10个整数逆序输出,每个数占一行。

样例输入

0 1 2 3 4 5 6 7 8 9


样例输出

9

8

7

6

5

4

3

2

1

0


解题思路


啊这,刚写过啊。。。


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


问题 G: 例题6-2 数组求解Fibonacci数列问题

Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。即:

要求输出Fibonacci数列的前20个数。


输入

输出

Fibonacci数列的前20个数,每个数占一行。


样例输入


样例输出

1

1

2

3

5

8

13

21

34

55

89

144

233

377

610

987

1597

2584

4181

6765


解题思路


思路还是老思路,就是要开数组罢了。


#include<stdio.h>
int main(){
    int a[20];
    a[0] = 1;
    a[1] = 1;
    for(int i = 2;i < 20;i++)
        a[i] = a[i-1] + a[i-2];
    for(int i = 0;i < 20;i++)
        printf("%d\n",a[i]);
    return 0;
}


问题 H: 例题6-3 冒泡排序

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


输入

以空格分隔的10个整数


输出

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


样例输入

1 3 5 7 9 2 4 6 8 0


样例输出

0

1

2

3

4

5

6

7

8

9

解题思路


就是冒泡排序的一个练习罢了。


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

问题 I: 例题6-4 矩阵转置

将一个2行3列的矩阵(二维数组)行列互换,存储到另一个3行2列的矩阵中。

要求以整型数据为例来解答。


输入

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


输出

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


样例输入

1 2 3

4 5 6

样例输出

1 4

2 5

3 6

解题思路


这个不一定非要转置,你说对吧?

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


问题 J: 例题6-9 字符串求最大值

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


输入

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

输出

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

样例输入

England

China

America


样例输出

England


解题思路


这不用strcmp会行?


#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int main(){
    char a[3][100];
    for(int i = 0;i < 3;i++)
        cin.getline(a[i],100);
    if(strcmp(a[0],a[1]) > 0){
        if(strcmp(a[0],a[2]) > 0)   puts(a[0]);
        else puts(a[2]);
    }
    else{
        if(strcmp(a[1],a[2]) > 0)   puts(a[1]);
        else puts(a[2]);
    }
    return 0;
}


相关文章
|
22天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
25 3
|
1月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
1月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
49 1
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
64 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
1月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
101 0
|
1月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
14 0
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
31 0
|
29天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
6天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
14天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。