合集-C++
摘要:在 C++ 中,“常对象”指的是一个在其生命周期中无法被修改的对象。也就是说,对常对象的任何修改操作都会被编译器禁止。这种对象被称为常量对象(const 对象)。 常对象的定义 常对象是在定义对象时使用 const 关键字修饰的。比如: const int x = 10; // x 是一个常对象 在
阅读全文
摘要:在 C++ 中,传递对象的引用而不是对象本身通常被视为一种最佳实践,特别是在处理较大的对象或复杂类时。这个做法有几个重要的理由和优点: 1. 性能优化 避免拷贝开销: 传递对象的副本可能会带来较大的性能开销,尤其是当对象很大或包含大量数据时。每次传递对象时都需要创建一个对象的副本,这会消耗额外的内存
阅读全文
摘要:在 C++ 中,为形参加上 const 修饰符主要是为了提高代码的安全性、清晰性和性能。即使你不会在函数中改变某个形参的值,加上 const 修饰符仍然有几个重要的好处: 1. 保护数据不被修改 将形参声明为 const 表示该函数承诺不会修改该参数的值。这种承诺是对调用者的一种保障,表明函数在处理
阅读全文
摘要:nth_element 是 C++ STL 中非常强大的算法之一,用于在一个范围内找到第 k 小(或第 k 大)的元素,并将其放到正确的位置,使得所有小于或等于该元素的值在其左边,所有大于该元素的值在其右边。这个算法的关键特点是它在找到第 k 小的元素时,复杂度为 O(n),比起全排序的 O(n l
阅读全文
摘要:当然可以。sprintf 函数和 sscanf 函数是 C 语言中非常实用的两个函数,它们主要用于字符串的格式化输入输出,但是方式有些不同。下面我会尽量用通俗的语言来解释它们。 sprintf 函数 sprintf 函数的名字可以理解为“string print format”,意思是“按照格式打印
阅读全文
摘要:一般情况下,printf 和 scanf 函数在速度上可能会比 cout 和 cin 快,尤其是在大量数据输出和输入的情况下。这里有几个原因可以解释为什么如此: 缓冲区处理: printf 和 scanf 是基于 C 标准 I/O 库,它们通常会使用缓冲区来优化输出和输入操作。一次性将数据写入或读取
阅读全文
摘要:矩阵旋转是一种常见的操作,通常包括将矩阵顺时针或逆时针旋转90度、180度或270度等。这里我将简要介绍如何进行顺时针旋转90度的操作,并给出示例代码。 顺时针旋转90度的方法: 要顺时针旋转一个n x n的矩阵,可以采用以下步骤: 转置矩阵:先将矩阵转置,即行变成列,列变成行。 反转每一行:然后反
阅读全文
摘要:当我们谈论位运算时,通常是指在计算机中直接操作二进制位的运算。位运算主要包括位与(&)、位或(|)、位异或(^)、位取反(~)以及左移(<<)和右移(>>)操作。 1. 位与(&) 位与运算符用符号 & 表示,它的规则是对两个操作数的每一位执行逻辑与操作,只有两个操作数对应位都为 1 时,结果位才为
阅读全文
摘要:std::ios::sync_with_stdio(0) 是一个 C++ 中的流控制函数,用于调整 C++ 标准输入输出流与 C 标准输入输出流的同步设置。 具体来说: 默认情况下,C++ 的输入输出流与 C 的输入输出流是独立的,即它们各自有自己的缓冲区,互相不干扰。这意味着,如果你使用了 C++
阅读全文
摘要:约数(Divisors) 约数是指能整除某个整数的其他整数。例如,对于整数 ( a ),如果存在整数 ( b ) 使得 ( a = b*c ),那么 ( b ) 就是 ( a ) 的约数。 性质: 1 和自身是每个整数的约数: 每个整数 ( a ) 都有至少两个约数:1 和 ( a ) 本身。 约数
阅读全文
摘要:试除法判断质数 试除法的思想 试除法是一种简单且直观的方法,用来判断一个数是否为质数。它的基本思想是:对于待判断的数 ( n ),从小到大地试除每个小于 ( n ) 的数 ( i ),如果 ( n ) 能被任何 ( i ) 整除且 () 和 (),则 ( n ) 不是质数;否则,( n ) 是质数。
阅读全文
摘要:辗转相除法 辗转相除法(也称欧几里德算法)是一种用于计算两个整数的最大公约数(Greatest Common Divisor, GCD)的有效方法。其原理基于以下性质:若 ( a >=b ),则 gcd(a,b)=gcd(b,a mod b)。这意味着可以通过反复将较大数替换为它与较小数的余数来求得
阅读全文
摘要:sort排序规则 要理解为什么使用 std::abs(a) > std::abs(b) 进行排序会导致绝对值降序排列,我们需要深入理解排序算法的比较规则以及如何使用这些规则来实现特定的排序需求。 排序算法中的比较规则 std::sort 使用的是一种排序算法,它根据比较函数的返回值来决定元素的相对顺
阅读全文
摘要:排序 1.冒泡排序 void bubblesort1(int* arr, unsigned int len) { //长度小于2就不用排序了 if (len < 2) return; for (int i = 0; i < len - 1; i++) { for (int j = 0; j < le
阅读全文
摘要:堆(Heap)的基本概念 堆是一种完全二叉树(Complete Binary Tree),其性质使得堆可以高效地支持以下操作: 插入(Insert):将一个新元素加入到堆中。 删除最大/最小元素(Delete Max/Min):移除并返回堆中的最大(大根堆)或最小(小根堆)元素。 获取最大/最小元素
阅读全文
摘要:使用 next_permutation 函数非常简单,以下是具体的步骤和注意事项: 步骤: 包含头文件:确保包含 <algorithm> 头文件,因为 next_permutation 函数位于这个头文件中。 #include <algorithm> 准备容器:next_permutation 可以
阅读全文
摘要:大盗阿福 本题与leetcode198题——打家劫舍的题意一模一样,阅读完本文以后可以尝试以下题目 力扣题目链接) 题目叙述: 阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。这条街上一共有N家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,
阅读全文
摘要:最长上升子序列 本文与leetcode300.最长递增子序列,这题题意一样,阅读完本文可以挑战一下 力扣链接 题目叙述: 给定一个无序的整数数组,找出其中最长上升子序列(LIS)的长度。 输入: [5,7,1,9,4,6,2,8,3] 输出 4 解释 最长上升子序列是[1,4,6,8],其长度为4。
阅读全文
摘要:最长公共子序列 本文讲解的题与leetcode1143.最长公共子序列这题一样,阅读完可以挑战一下。 力扣题目链接 题目叙述: 给定两个字符串,输出其最长公共子序列,并输出它的长度 输入: ADABEC和DBDCA 输出: DBC 3 解释 最长公共子序列是DBC,其长度为3 动态规划思路: 我们这
阅读全文
摘要:最长公共子串 阅读本文前可以先了解“动态规划方法论”,在我之前讲过的文章有讲过。 动态规划方法论 本文讲解的题与leetcode718.最长重复子数组,题意一模一样,阅读完本文以后可以去挑战这题。 力扣链接 题目叙述: 给定两个字符串,输出其最长公共子串的长度。 输入 ABACCB AACCAB 输
阅读全文