首页 > 其他分享 >转轮数组

转轮数组

时间:2024-04-03 10:57:31浏览次数:28  
标签:begin end reverse nums 转轮 元素 数组 size

1、题目要求

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

2、题解

 1 class Solution {
 2 public:
 3     void rotate(vector<int>& nums, int k) {
 4        vector<int>lunzhuan;
 5        if(k > 0)
 6        {
 7           for(int i = 0; i < nums.size(); ++i)
 8           {
 9             if(i < k)
10             {
11                 lunzhuan.push_back(nums[nums.size()+i-k]);
12             }
13             else
14             {
15                 lunzhuan.push_back(nums[i-k]);
16             }
17           }
18            nums.swap(lunzhuan);   
19        }
20           
21     }
22 };

报错:可能存在k大于数组长度,如果 k 大于 nums 的长度,直接使用 k 会导致索引越界。旋转等效次数应该是 k % nums.size()

增加 k %= nums.size();

 1 class Solution {
 2 public:
 3     void rotate(vector<int>& nums, int k) {
 4        vector<int>lunzhuan;
 5        k %= nums.size();
 6        if(k > 0)
 7        {
 8           for(int i = 0; i < nums.size(); ++i)
 9           {
10             if(i < k)
11             {
12                 lunzhuan.push_back(nums[nums.size()+i-k]);
13             }
14             else
15             {
16                 lunzhuan.push_back(nums[i-k]);
17             }
18           }
19            nums.swap(lunzhuan);   
20        }
21           
22     }
23 };

方法二、

 1 class Solution {
 2 public:
 3     void rotate(vector<int>& nums, int k) {
 4       int n = nums.size();
 5       k %= nums.size();
 6       reverse(nums.begin(),nums.end());
 7       reverse(nums.begin(),nums.begin()+k);
 8       reverse(nums.begin()+k,nums.end());     
 9     }
10 };

问题1:reverse函数的使用说明

在 C++ 中,reverse() 函数接受两个迭代器作为参数,分别表示反转区间的开始和结束。

这个区间遵循半开半闭的原则,即包含起始位置的元素,但不包含结束位置的元素。因此,当你调用

reverse(nums.begin(), nums.begin() + k);

时,它会反转从 nums.begin() 开始的 k 个元素,实际上反转的是 [0, k-1] 的索引区间。

紧接着,当你调用

reverse(nums.begin() + k, nums.end());

时,意图是反转从索引 k 到数组末尾的元素。由于区间是左闭右开的,因此这个调用实际上反转的是从 k 开始到 n-1 (其中 nnums.size())的元素,即索引区间 [k, n-1]

问题2:reverse(nums.begin(), nums.end())的原理  

reverse() 函数和大多数 STL 算法遵循半开半闭区间原则(即,包括开始迭代器指向的元素,但不包括结束迭代器指向的元素)。这种设计允许算法能够以统一的方式处理空容器和非空容器,同时简化了边界条件的处理。

当我们调用 reverse(nums.begin(), nums.end()); 时,实际上是要反转从 nums.begin() 开始到 nums.end() 之前的所有元素。这里的 nums.end() 并不指向数组的最后一个元素,而是指向最后一个元素之后的“假想”位置。因此,即便按照半开半闭的原则,这个范围仍然涵盖了数组中的所有元素。

简而言之,nums.end() 并不指向任何实际的元素,而是作为一个标记,表示数组末尾元素的下一个位置。这就是为什么 reverse(nums.begin(), nums.end()); 能够反转整个数组而不漏掉最后一个元素的原因。

 

标签:begin,end,reverse,nums,转轮,元素,数组,size
From: https://www.cnblogs.com/Zhouce/p/18112187

相关文章

  • 力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码
    349.两个数组的交集,387.字符串中的第一个唯一字符,394.字符串解码,每题做详细思路梳理,配套Python&Java双语代码,2024.04.02 可通过leetcode所有测试用例。目录349.两个数组的交集解题思路完整代码PythonJava387.字符串中的第一个唯一字符解题思路完整代码Python......
  • 蓝桥杯算法集训 - Week 5:树状数组、各类DP算法
    蓝桥杯算法集训-Week5本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、树状数组树状数组是一种数据结构,可以快速地完成以下两个操作:将第i个数加上c快速求前缀和,即任意区间[i,j]的和Ⅰ、代码模板//树状数组长度......
  • 由浅到深认识Go语言(7):数组
    该文章Github地址:https://github.com/AntonyCheng/go-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况下推荐直......
  • 【每日一道算法题】有序数组的平方、长度最小的子数组
    文章目录有序数组的平方写在前面题目思路解析暴力解法双指针法我的代码暴力解法双指针法参考答案解法暴力方法双指针法长度最小的子数组原题思路解析暴力法滑动窗口法我的代码官方题解滑动窗口法有序数组的平方写在前面本人是一名在java后端寻路的小白,希望......
  • array_merge 和 [] 追加元素在处理数组时的区别
    $array1=[['id'=>1,'name'=>'商品A','quantity'=>2],['id'=>2,'name'=>'商品B','quantity'=>1],];$array2=[['id'=>3,�......
  • Java(对象数组与继承性的一些特点)
    1.数组是语言中重要的一种数据类型,我们常用于大型数据处理,当我们需要创建某类的许多对象,为了提高效率,Java中提供了对象数组,即将对象作为引用类型。a.使用对象数组时必须为每个元素赋值;b.构建对象数组时与平常数组构造相似,类名[]数组名=new类名[对象个数];2.代码展示—......
  • 就业班 第二阶段 2401--3.29 day9 shell之正则+数组
    九、shell编程-数组普通数组:只能用整数作为数组的索引关联数组:可以使用字符串作为数组的索引数组定义普通数组定义:[root@newrainshell]#books=(linuxshellawksed) 引用:[root@newrainshell]#echo${books[0]}linux[root@newrainshell]#echo${books......
  • Java常用新特性之“构造器引用”和“数组引用”
    1.构造器引用1.1格式:类名::new1.2说明:构造器引用在执行时,会调用指定的类的构造器,创建其对象。具体调用的是哪个形参列表的构造器呢?取决于函数式接口的抽象方法的形参列表。此抽象方法的形参列表与要调用的构造器的形参列表相同。调用指定构造器后,创建的对象作为......
  • 根据一个数组筛选另一个数组的数据,组合成一个新数组
    这段代码定义了两个数组:fixedArray包含国家信息的固定数组,flowArray包含需要筛选的国家代码。然后使用filter方法筛选fixedArray中包含在flowArray中的元素,返回新的数组newArray。最后打印筛选后的新数组。//定义一个包含国家信息的固定数组letfixedArray=[......
  • Golang | Leetcode Golang题解之第4题寻找两个正序数组的中位数
    题目:题解:funcfindMedianSortedArrays(nums1[]int,nums2[]int)float64{iflen(nums1)>len(nums2){returnfindMedianSortedArrays(nums2,nums1)}m,n:=len(nums1),len(nums2)left,right:=0,mmedian1,median2:=0,0......