当前位置: 首页 > news >正文

每日算法刷题Day11-最大公约数、数组去重

⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法。

🔥本文已收录于算法刷题系列专栏: 每日算法题解 欢迎订阅,持续更新。

6d4ffada7fe0312172f742dc9409ec40

文章目录

      • 33.最大公约数
        • 输入格式
        • 输出格式
        • 数据范围
        • 输入样例:
        • 输出样例:
        • 思路
      • 34.数组去重
        • 输入格式
        • 输出格式
        • 数据范围
        • 输入样例:
        • 输出样例:
        • 思路
        • sort自定义排序函数
          • 1.sort简介
          • 2.使用方法

33.最大公约数

输入两个整数 a 和 b,请你编写一个函数,int gcd(int a, int b), 计算并输出 a 和 b 的最大公约数。

输入格式

共一行,包含两个整数 a 和 b。

输出格式

共一行,包含一个整数,表示 a 和 b 的最大公约数。

数据范围

1≤a,b≤1000

输入样例:

12 16

输出样例:

4

思路

常见思路:利用循环求解

#include<bits/stdc++.h>
using namespace std;

int gcd(int a, int b)
{   
    for(int i = min(a,b);i >=1;i--)
    {
        if(b%i==0 && a%i == 0)return i;
    }
}

int main()
{
    int a,b;
    
    cin>>a>>b;
    
    cout<< gcd(a,b)<<endl;
    
    return 0;
    
}

此外可以采用欧几里得算法解决(辗转相除法)

part2 辗转相除法(欧几里得算法)
前置定理: g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b) = gcd(b,a mod b) gcd(a,b)=gcd(b,amodb)

可以一直将 g c d ( a , b ) gcd(a,b) gcd(a,b)转化为 g c d ( x , 0 ) gcd(x,0) gcd(x,0),此时 x 为 g c d ( a , b ) gcd(a,b) gcd(a,b)

代码:

while (b) {

    int tmp = a % b;
    
    a = b;
    b = tmp;

}

时间复杂度 O(log2(a+b))。

34.数组去重

给定一个长度为 n 的数组 a,请你编写一个函数:

int get_unique_count(int a[], int n);  // 返回数组前n个数中的不同数的个数

输入格式

第一行包含一个整数 n。

第二行包含 n 个整数,表示数组a。

输出格式

共一行,包含一个整数表示数组中不同数的个数。

数据范围

1≤n≤1000,
1≤ai≤1000。

输入样例:

5
1 1 2 4 5

输出样例:

4

思路

第一种思路:

采取分别对每个数字出现的次数计数,最后再统计出现次数不为0的个数。

#include<bits/stdc++.h>
using namespace std;


int get_unique_count(int a[],int n)
{
    int cnt[1001] = {0},tot = 0;
    for(int i = 0 ; i < n; i++)
    {
        for(int j = 0; j <= 1000; j++){
        if(a[i] == j )cnt[a[i]]++;}
    }
    
    for(int i = 0; i <= 1000; i++)
        if(cnt[i] != 0)tot++;
        
    cout<< tot<<endl;
}

int main()
{
    int n,a[1001];
    cin >> n;
    for(int i = 0; i < n; i++)cin >> a[i];
    
    get_unique_count(a , n);
    
    return 0;
}

第二种思路:

采取判断该数之前是否出现过。用bool做标记。

#include<bits/stdc++.h>
using namespace std;


int get_unique_count(int a[],int n)
{
    int cnt = 0;
    for(int i = 0; i < n; i++)
    {//本次要比较的数
        bool occurred = false;
        for(int j = 0; j < i; j++)
        {//前面所有的数
            if(a[i] == a[j])
            {
                occurred = true;
                break;
            }
        }
        if(occurred == false)cnt ++;
    }
    return cnt;
}

int main()
{
    int n,a[1001];
    cin >> n;
    
    for(int i = 0; i < n; i++)cin >> a[i];
    
    cout << get_unique_count(a , n);
    
    return 0;
}

第三种思路:

先对数组进行排序,这时会把数字相同的排序在一起,再使用双指针方法去重,最后统计前一个指针的数目即可。

#include<bits/stdc++.h>
using namespace std;


int get_unique_count(int a[],int n)
{
    int k = 1;//第一个指针
    for(int j = 1; j < n ; j++)
    {//第二个指针
        if(a[j] != a[k-1])
            a[k++] = a[j];//如果不相等,标记一下
    }
    return k;
        
}

int main()
{
    int n,a[1001];
    cin >> n;
    
    for(int i = 0; i < n; i++)cin >> a[i];
    sort(a, a+n);//注意需要提前由小到大排序好
    cout << get_unique_count(a , n);
    return 0;
}

sort自定义排序函数

1.sort简介

(1)用于C++中,对给定区间所有元素进行排序;

(2)使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高;

(3)头文件 #include 。

2.使用方法

sort函数有三个参数

sort(first,last,cmp);

其中,first是元素的起始地址last结束地址cmp排序的方式。对**[first,last)(一定要注意这里的区间是左闭又开)**区间内数据根据cmp的方式进行排序。也可以不写第三个参数,此时按默认排序,从小到大进行排序。

相关文章:

  • 网络安全CTF竞赛模式、题目类别、所用工具小结
  • 80,90,00,房子最终砸在买房哪一代人手中?
  • 微服务项目:尚融宝(59)(核心业务流程:提现和还款(2))
  • jetson nano补充:根目录/usr刷机扩容 瘦身
  • Java工程师面试题
  • 网课查题接口使用
  • 算法练习(堆/栈/队列)
  • 大数据-ClickHouse技术一(安装部署)
  • 【Android入门】4、数据持久化:文件、SharedPreferences 和 Sqlite
  • style样式优先级问题【display:block依旧无法显示DOM元素】
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • 面试宝典------经典
  • node.js环境搭建
  • 【5G核心网】手把手教你将Open5gs托管到k8s(KubeSphere)
  • 空城机在CSDN的四周年创作纪念日
  • 【Amaple教程】5. 插件
  • java正则表式的使用
  • js ES6 求数组的交集,并集,还有差集
  • Just for fun——迅速写完快速排序
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • rabbitmq延迟消息示例
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • SwizzleMethod 黑魔法
  • vue学习系列(二)vue-cli
  • Wamp集成环境 添加PHP的新版本
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 记一次和乔布斯合作最难忘的经历
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 手写一个CommonJS打包工具(一)
  • 为视图添加丝滑的水波纹
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​渐进式Web应用PWA的未来
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #微信小程序:微信小程序常见的配置传旨
  • (Ruby)Ubuntu12.04安装Rails环境
  • (差分)胡桃爱原石
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (接口封装)
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转) RFS+AutoItLibrary测试web对话框
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .gitignore文件_Git:.gitignore
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net core 连接数据库,通过数据库生成Modell
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET企业级应用架构设计系列之应用服务器
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET中 MVC 工厂模式浅析