1. 轮转数组问题解析
轮转数组是算法面试中的经典问题,题目要求将数组元素向右轮转k个位置。比如数组[1,2,3,4,5,6,7]向右轮转3个位置会变成[5,6,7,1,2,3,4]。这个问题看似简单,但实现起来有几个关键点需要注意。
首先,k值可能大于数组长度。比如数组长度为7,k=10时,实际效果等同于k=3(因为10%7=3)。这就是为什么代码中第一件事就是对k取模。如果不做这个处理,当k大于数组长度时,直接访问nums+n-k会导致数组越界。
实际工程中,边界条件处理往往比核心逻辑更重要。养成对输入参数进行校验的习惯,可以避免很多潜在bug。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 临时数组法实现细节
2.1 内存操作三部曲
临时数组法的核心思路是:
- 创建与原数组相同大小的临时数组tmp
- 将原数组后k个元素复制到tmp开头
- 将原数组前n-k个元素复制到tmp剩余位置
- 将tmp完整复制回原数组
这种方法的优势是时间复杂度为O(n),空间复杂度也是O(n),在大多数场景下性能足够好。
c复制void _rotate(int* nums, int numSize, int k, int* tmp) {
k %= numSize; // 关键步骤:处理k大于数组长度的情况
int n = numSize;
memcpy(tmp, nums+n-k, sizeof(int)*k); // 复制后k个元素到tmp开头
memcpy(tmp+k, nums, sizeof(int)*(n-k)); // 复制前n-k个元素到tmp剩余位置
memcpy(nums, tmp, sizeof(int)*n); // 将tmp完整复制回原数组
}
2.2 memcpy函数深度解析
memcpy是C标准库中的内存拷贝函数,声明在string.h头文件中。其函数原型为:
c复制void *memcpy(void *dest, const void *src, size_t n);
三个参数分别是:
- dest:目标内存地址
- src:源内存地址
- n:要复制的字节数
在数组操作中,nums+n表示数组第n个元素的地址(注意不是索引n,而是偏移n个元素的位置)。因
