【C语言刷题】牛客网编程入门130精选题目(二)

 

牛客网编程入门130题–精选(二)

 

在这里插入图片描述

 

本篇文章衔接博客:牛客网编程入门130–精选(一)

 

题目OJ链接

  1. T79.图形相似度

  2. T88.有序数组中插入一个数

  3. T96.有序序列判断

  4. T108.矩阵初等变化

  5. T109.杨辉三角

  6. T110.井字棋判断输赢

  7. T111.进制转换

  8. T113.小乐乐定闹钟

  9. T115.最大公因数 与 最小公倍数之和

  10. T116.小乐乐改数字

 

1.图形相似度

T79.图形相似度

描述

给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。

输入描述:

第一行包含两个整数m和n,表示图像的行数和列数,用单个空格隔开。1≤m≤100, 1≤n≤100。之后m行,每行n个整数0或1,表示第一幅黑白图像上各像素点的颜色,相邻两个数用单个空格隔开。之后m行,每行n个整数0或1,表示第二幅黑白图像上各像素点的颜色,相邻两个数用单个空格隔开。

输出描述:

一个实数,表示相似度(以百分比的形式给出),精确到小数点后两位。

示例1

输入:

3 3
1 0 1
0 0 1
1 1 0
1 1 0
0 0 1
0 0 1

输出:

44.44

 

💡思路

相似度 = (相等的元素的个数 / 总元素)*100%

 

参考代码

#include <stdio.h>

int main()
{
      
    int m = 0,n = 0;

    scanf("%d %d",&m,&n);

    int arr1[m][n];//变长数组

    int arr2[m][n];

    int count = 0;//记录相同元素的个数

    for(int i = 0;i<m;++i)
    {
   
        for(int j = 0;j<n;++j)
        {
   
            scanf("%d",&arr1[i][j]);
        }
    }

    for(int i = 0;i<m;++i)
    {
   
        for(int j = 0;j<n;++j)
        {
   
            scanf("%d",&arr2[i][j]);

            if(arr1[i][j] == arr2[i][j])
            {
   
                ++count;
            }
        }
    }

    printf("%.2lf\n",((double)count)/m/n*100);
    
    return 0;
}

 

解释

  1. 代码中采用了C99标准提出的变长数组知识点,GCC编译器支持变长数组,Visual stdio不支持
  2. 在输入数组2元素时,就可以跟数组1的元素进行比较了,这样可以少遍历一遍,当然时间复杂度还是一样的

 

2.有序数组中插入一个数

T88.有序数组中插入一个数

描述

有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。

 

输入描述:

共三行,
第一行输入一个整数(0≤N≤50)。
第二行输入N个升序排列的整数,输入用空格分隔的N个整数。
第三行输入想要进行插入的一个整数。

输出描述:

输出为一行,N+1个有序排列的整数。

示例1

输入:

7 
5 30 40 50 60 70 90
20

输出:

5 20 30 40 50 60 70 90

 

💡思路1

“取巧”(耍赖皮),只要符合输出结果即可

遍历原来数组,如果比num小就打印,如果比num大,就先打印num,再打印元素。

这样就可以产生“视觉上”的插入数据。

参考代码

#include<stdio.h>
#include<stdbool.h>

int main()
{
   
    int n = 0;
    scanf("%d",&n);
    int arr[n];

    for(int i = 0;i<n;++i)
    {
   
        scanf("%d",&arr[i]);
    }

    int num = 0;
    scanf("%d",&num);
    bool flag = true;//判断是否需要插入数据

    for(int i = 0;i<n;++i)
    {
   
        if(flag && num < arr[i])
        {
   
            printf("%d ",num);
            flag = false;//插入完数据之后,之后就不需要再插入数据了
        }

        printf("%d ",arr[i]);
    }

    //有可能数据是最后插入的,所以咱们还需要检查一次
    if(flag)
    {
   
        printf("%d",num);
    }

    return 0;
}

 

💡思路2

实实在在地进行插入数据

逻辑 – 将大象放进冰箱

第一步:找到数据需要插入的位置

第二步:挪动数据,将这个位置腾出来

第三步:将数据放进该位置

在这里插入图片描述

挪动数据的过程

为了不在挪动的过程中将数据覆盖

方法:从后面开始挪动数据

在这里插入图片描述

为了更加代码可读性,可维护性,咱们使用函数实现的特定的功能

  • 函数find – 查找元素位置
  • 函数insert – 进行数据插入的功能

参考代码

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值