算法刷题基础知识总结

news2024/10/27 12:23:01

文章目录

  • 处理输入输出
  • 常用数据结构
  • 数学知识
    • 数论基础
      • 质数和合数
      • 因数/约数
      • 互为质数
    • 阶乘
    • 排列与组合
  • 排序
    • 字典序
    • Comparator接口

处理输入输出

Scanner 类可以读取多种类型的数据,包括:

  1. nextInt():读取整数。
  2. nextDouble():读取双精度浮点数。
  3. nextLine():读取整行字符串(包括空格)。
  4. next():读取下一个完整的单词。

常用数据结构

数学知识

数论基础

质数和合数

只有两个正因数(1和它本身)的自然数称为质数。比1大但不是质数的数称为合数。1和0既非质数也非合数。

public static boolean isPrimeNumber(int a){
    // 0 和 1 既不是质数和不是合数
    if (a < 2 ){
        return false;
    }
    for (int i = 2; i < a; i++) {
        if (a % i == 0) {
            return false;
        }
    }
    return true;
}

第二种方式,由于a = b * c,那么b,c一定小于a的平方根;可以说明,a的其他因数的平方一定小于a.

public static boolean isPrimeNumber(int a){
    //0和1既不是质数和不是合数
    if (a < 2 ){
        return false;
    }
    boolean b = true;
    for (int i = 2; i*i < a; i++) {
        if (a % i == 0){
            return false;
        }
    }
    return true;
}

因数/约数

因数是指能够整除一个整数的数。换句话说,如果一个整数 𝑎 被另一个整数 𝑏 除,且结果是一个整数(没有余数),那么 𝑏 就是 𝑎 的因数。

互为质数

互质(又称为 质数 或 互为质数)是指两个或多个整数之间的一种关系:如果它们的最大公约数(GCD)是 1,则称这些整数互质。

判断2个数互为质数: 辗转相除法

可以通过求最大公约数是否为1判断两数互为质数

public static boolean isPrimeNumber(int a ,int b){
    // 辗转相除法
    while (b != 0) {
        int temp = a % b;
        a = b;
        b = temp;
    }
    return a == 1 ? true: false;
}

判断N个数互为质数

根据互为质数可以得到,质数的最大公约数是一,那么用哈希表保存各个因数的累计值,除了1以外的因数,其他存在大于1的数,则不互为质数。

public static boolean isPrimeNumberAll(int[] nums) {
    HashSet<Integer> set = new HashSet<>();
    for (int num : nums) {
        if (num < 2) {
            return false;
        }
        for (int i = 2; i * i <= num; i++) {
            if (num % i == 0 && set.contains(i)) {
                return false;
            } else {
                set.add(i);
            }
        }
    }
    return true;
}

根据互质数的定义,可总结出一些规律,利用这些规律能迅速判断一组数是否互质。
(1)两个不相同的质数一定是互质数。如:7和11、17和31是互质数。
(2)两个连续的自然数一定是互质数。如:4和5、13和14是互质数。
(3)相邻的两个奇数一定是互质数。如:5和7、75和77是互质数。
(4)1和其他所有的自然数一定是互质数。如:1和4、1和13是互质数。
(5)两个数中的较大一个是质数,这两个数一定是互质数。如:3和19、16和97是互质数。
(6)两个数中的较小一个是质数,而较大数是合数且不是较小数的倍数,这两个数一定是互质数。如:2和15、7和54是互质数。
(7)较大数比较小数的2倍多1或少1,这两个数一定是互质数。如:13和27、13和25是互质数。

阶乘

阶乘是一个数学概念,通常用符号 𝑛! 表示,代表一个正整数 𝑛 的阶乘。阶乘的定义是将所有正整数从 1 乘到 𝑛 的结果。阶乘只适用于非负整数。

n!=(n−1)×(n−2)×…×3×2×1

特殊情况:0!=1(这是一个约定,方便数学运算)

排列与组合

排列是指从 𝑛 个不同元素中选取 𝑟 个元素的不同排列方式。排列考虑了元素的顺序。

在这里插入图片描述
n! 表示 𝑛 的阶乘,定义为 𝑛×(𝑛−1) x (𝑛−2) x… x 2x1。𝑟 是选取的元素个数。

组合是指从 𝑛 个不同元素中选取 𝑟 个元素的不同组合方式。组合不考虑元素的顺序。

在这里插入图片描述

求排列和组合

如果只需要求数量,可以直接通过代码计算公式即可:

public class PermutationCombination {
    // 计算阶乘
    public static long factorial(int n) {
        if (n == 0) return 1;
        long result = 1;
        for (int i = 1; i <= n; i++) {
            result *= i;
        }
        return result;
    }

    // 计算排列
    public static long permutation(int n, int r) {
        return factorial(n) / factorial(n - r);
    }

    // 计算组合
    public static long combination(int n, int r) {
        return factorial(n) / (factorial(r) * factorial(n - r));
    }

    public static void main(String[] args) {
        int n = 5; // 总元素个数
        int r = 3; // 选取元素个数

        long permResult = permutation(n, r);
        long combResult = combination(n, r);

        System.out.println("P(" + n + ", " + r + ") = " + permResult);
        System.out.println("C(" + n + ", " + r + ") = " + combResult);
    }
}

如果要求所有的排列或者组合,参考以下程序:

import java.util.ArrayList;
import java.util.List;

public class PermutationAndCombination {

    public static void main(String[] args) {
        // 生成所有排列
        int[] nums = {1, 2, 3}; // 输入数组
        System.out.println("All permutations:");
        List<List<Integer>> permutations = generatePermutations(nums);
        for (List<Integer> perm : permutations) {
            System.out.println(perm);
        }

        // 生成所有组合
        int n = 5; // 总元素个数
        int r = 3; // 选取元素个数
        System.out.println("\nAll combinations:");
        List<List<Integer>> combinations = generateCombinations(n, r);
        for (List<Integer> comb : combinations) {
            System.out.println(comb);
        }
    }

    // 生成所有排列
    public static List<List<Integer>> generatePermutations(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        backtrackPermutations(result, new ArrayList<>(), nums);
        return result;
    }

    private static void backtrackPermutations(List<List<Integer>> result, List<Integer> tempList, int[] nums) {
        if (tempList.size() == nums.length) {
            result.add(new ArrayList<>(tempList));
        } else {
            for (int i = 0; i < nums.length; i++) {
                if (tempList.contains(nums[i])) continue; // 元素已存在,跳过
                tempList.add(nums[i]);
                backtrackPermutations(result, tempList, nums);
                tempList.remove(tempList.size() - 1); // 回溯
            }
        }
    }

    // 生成所有组合
    public static List<List<Integer>> generateCombinations(int n, int r) {
        List<List<Integer>> result = new ArrayList<>();
        backtrackCombinations(result, new ArrayList<>(), 1, n, r);
        return result;
    }

    private static void backtrackCombinations(List<List<Integer>> result, List<Integer> tempList, int start, int n, int r) {
        if (tempList.size() == r) {
            result.add(new ArrayList<>(tempList));
        } else {
            for (int i = start; i <= n; i++) {
                tempList.add(i);
                backtrackCombinations(result, tempList, i + 1, n, r);
                tempList.remove(tempList.size() - 1); // 回溯
            }
        }
    }
}

排序

字典序

字典序(又称字典排列、字典顺序)是一种将字符串(或其他序列)按字母(或元素)顺序排列的方式,类似于在字典中查找单词的顺序。字典序是基于字符的 Unicode 值进行比较的。

在字典序中,字符串的比较通常遵循以下原则:

  1. 逐字符比较:从字符串的第一个字符开始,逐个字符进行比较。
  2. 字符顺序:如果两个字符串的第一个字符不同,则较小的字符对应的字符串在前。如果第一个字符相同,则比较第二个字符,以此类推。
  3. 长度比较:如果一个字符串是另一个字符串的前缀,则较短的字符串排在前面。例如,“apple” 在字典序中排在 “applepie” 之前。

许多编程语言提供了内置的字符串比较功能,通常可以直接使用这些功能来实现字典序的排序。例如,在 Java 中,可以使用 Arrays.sort() 方法对字符串数组进行字典序排序。

String[] words = {"apple", "banana", "apricot", "grape"};
// 按字典序排序
Arrays.sort(words);

两个字符串之间比较:

String a = "apple";
String b = "banana";
// 直接通过compareTo进行比较就是字典序
a.compareTo(b)

Comparator接口

int compare(T o1, T o2):比较两个对象,返回负整数、零或正整数,以指示第一个对象是否小于、等于或大于第二个对象。

compare(T o1, T o2) 方法的返回值决定了排序的顺序,默认是按升序排列的:

  1. 返回负整数:表示 o1 小于 o2,在排序中 o1 会排在 o2 前面。
  2. 返回零:表示 o1 等于 o2,它们的位置不变。
  3. 返回正整数:表示 o1 大于 o2,在排序中 o1 会排在 o2 后面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vitepress一键push和发布到github部署网站脚本

文章目录 前言一、viteress基本结构二、脚本1、push2、dev 总结 前言 没啥可说的 脚本是bat文件&#xff0c;直接双击运行 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、viteress基本结构 创建完你的文档&#xff0c;目录如下 ---bin ---docs …

java计算机毕设课设—写字板程序(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式再最下方 java计算机毕设课设—写字板程序(附源码、文章、相关截图、部署视频) 一、项目简介 本毕设旨在开发一个高效、易用的基于Java的写字板程序&#xff0c;通过利用Java的Swing库构建用户界面&#xff0c;实现基本的文本编辑功能…

Ubuntu 22.04系统启动时自动运行ROS2节点

在 Ubuntu 启动时自动运行 ROS2 节点的方法 环境&#xff1a;Ubuntu 系统&#xff0c;ROS2 Humble&#xff0c;使用系统自带的 启动应用程序 目标&#xff1a;在系统启动时自动运行指定的 ROS2 节点 效果展示 系统启动后&#xff0c;自动运行小乌龟节点和键盘控制节点。 实践…

直接删除Github上的文件

直接删除Github上的文件 说明&#xff1a;此操作只删除Github上的文件&#xff0c;本地仓库文件不受影响 1.确定要删除哪个分支文件,以删除main为例&#xff0c; 1.找到本地仓库位置以StudyNote为例&#xff0c;右键 bash here 2.打开命令窗口&#xff0c;将Github的StudyN…

个体能量的勇气层级是否容易达到?

没有勇气面对现实&#xff0c;没有勇气改变自我&#xff0c;没有勇气改变环境&#xff0c;没有勇气创新创造。 这是常态。 如何找寻高质量免费机器人工程资源自学提升-CSDN博客 个人能力的提升&#xff0c;也包括个体能量的提升。 个体能量是个人能力的一个非常重要的衡量指…

微信好友智能管理神器:微动RPA,重塑私域流量构建新纪元 批量自动添加好友

在这个信息爆炸的时代&#xff0c;微信作为私域流量的重要阵地&#xff0c;其好友管理的高效与否直接关乎着个人品牌影响力与商业价值的挖掘。然而&#xff0c;面对海量潜在客户&#xff0c;手动添加好友不仅耗时费力&#xff0c;更可能因频繁操作触发微信风控机制&#xff0c;…

(linux驱动学习 - 12). IIC 驱动实验

目录 一.IIC 总线驱动相关结构体与函数 1.i2c_adapter 结构体 2.i2c_algorithm 结构体 3.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_adapter 4.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_numbered_adapter 5.删除 I2C 适配器 - i2c_del_adapter 二.IIC 设…

影刀RPA实战:验证码识别功能指令

1.影刀官方验证码识别 1.1 介绍 功能&#xff1a;基于AI引擎提供的验证码识别服务&#xff0c;使用影刀内置的AI引擎来识别验证码&#xff0c;使用第三图鉴账号来识别验证码&#xff0c;选填写用户名及密码&#xff0c; 可识别的验证码类型&#xff1a; 纯数字&#xff1a;适…

python学习-第一个小游戏(vscode环境)

学习小甲鱼的视频&#xff0c;写了一个小游戏&#xff0c;vscode环境 运行结果 源码地址&#xff1a; python小游戏-猜数字源码

Visual Studio2022 Profile 工具使用

本篇研究下Visual Studio自带的性能分析工具&#xff0c;针对C代码&#xff0c;基于Visual Studio2022 文章目录 CPU使用率检测并发可视化工具使用率视图线程视图内核视图并发可视化工具SDK 参考资料 CPU使用率 对于CPU密集型程序&#xff0c;我们可以通过分析程序的CPU使用率…

系统架构设计师教程 第2章 2.5 计算机网络 笔记

2.5计算机网络 ★☆☆☆☆ 2.5.1网络的基本概念 1.计算机网络的发展 计算机网络发展&#xff0c;其大致经历了诞生、形成、互联互通和高速发展等4个阶段。 2.计算机网络的功能 1)数据通信 数据通信是依照一定的通信协议&#xff0c;利用数据传 输技术在两个通信结点之间传…

【Spring Boot】元注解

元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解 元注解就是定义注解的注解&#xff0c;是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解…

linux中级(NFS服务器)

NFS&#xff1a;用于在NNIX/Linux主机之间进行文件共享的协议 流程&#xff1a;首先服务端开启RPC服务&#xff0c;并开启111端口&#xff0c;服务器端启动NFS服务&#xff0c;并向RPC注册端口信息&#xff0c;客户端启动RPC&#xff0c;向服务器RPC服务请求NFS端口&#xff0…

Matlab数字信号处理——基于改进小波变换的图像去噪方法(7种去噪算法)

1.基于小波变换的阈值收缩法去噪 该方法利用小波变换分离出信号中的噪声成分&#xff0c;并通过设置合适的阈值对小波系数进行收缩&#xff0c;保留主要信息的同时&#xff0c;去除噪声。 %基于小波变换的阈值收缩法去噪算法 clear clc Iimread(nana.png); X im2double(I); …

深入理解C语言中的静态库与动态库 —— 原理与实践

引言 在 C 语言编程中&#xff0c;库是预编译的代码集合&#xff0c;用于实现特定功能&#xff0c;以供其他程序使用。库可以分为静态库和动态库两种主要类型。静态库在编译阶段被链接到目标程序中&#xff0c;而动态库则是在运行时被加载。本文旨在深入探讨这两种库的工作原理…

渗透测试-百日筑基—SQL注入篇时间注入绕过HTTP数据编码绕过—下

day8-渗透测试sql注入篇&时间注入&绕过&HTTP数据编码绕过 一、时间注入 SQL注入时间注入&#xff08;也称为延时注入&#xff09;是SQL注入攻击的一种特殊形式&#xff0c;它属于盲注&#xff08;Blind SQL Injection&#xff09;的一种。在盲注中&#xff0c;攻击…

Android 在github网站下载项目:各种很慢怎么办?比如gradle下载慢;访问github慢;依赖下载慢

目录 访问github慢gradle下载慢依赖下载慢 前言 大家好&#xff0c;我是前期后期&#xff0c;在网上冲浪的一名程序员。 为什么要看这篇文章呢&#xff1f;问题是什么&#xff1f; 我们在Github上面看到一些好的项目的时候&#xff0c;想下载下来研究学习一下。但经常遇到各…

外面卖几百的Ai数字人软件 说123456生成视频 去授权版本

下载&#xff1a;https://pan.quark.cn/s/27a0cff98eae 可以无限制使用。

网络拓扑视角下的IP地址管理优化

前言 对IP地址进行有效管理&#xff0c;好处是能 提升网络运行效率&#xff0c;还可以保障网络安全和稳定。网络拓扑结构本身作为网络描述中各节点联系的主要角色&#xff0c;为IP地址管理提供了一些优化策略。 网络拓扑和IP地址管理的关系 网络拓扑结构描述了网络中各节点&a…

【Spring MVC】响应结果和设置

​ 我的主页&#xff1a;2的n次方_ 1. 返回静态页面 先创建一个 html 页面 ​ 如果还按照之前的方式进行返回的话&#xff0c;返回的并不是一个 html 页面 RequestMapping("/response") RestController public class ResponseController {RequestMapping(&quo…