ProDeveloperTutorial.com

教程和编程解决方案
菜单
  • Shell脚本
  • 系统设计
  • Linux系统编程
  • 4g LTE
  • 编码问题
  • C
  • C ++
  • DSA
  • GIT

给定一个数组和一个数字n,将数组旋转n步到C ++中正确的解决方案

前开发者教程 2019年2月7日
Example:
Array = {1, 2, 3, 4, 5 ,6, 7};
n = 4

Output:
[4, 5, 6, 7, 1, 2, 3]

Explanation:
rotate 1 steps to the right: [7, 1, 2, 3, 4, 5, 6]
rotate 2 steps to the right: [6, 7, 1, 2, 3, 4, 5]
rotate 3 steps to the right: [5, 6, 7, 1, 2, 3, 4]
rotate 4 steps to the right: [4, 5, 6, 7, 1, 2, 3]

这个问题可以用两种不同的方法解决。

 

方法1:复制数组并旋转元素。

在此解决方案中,我们将复制数组,然后根据公式“(i + k)%len”替换项。

这将从要旋转的位置开始。然后将元素从复制数组复制到原始数组。

Test Case:

K = 4, hence the position will become

i = 0 k = 4 len = 7 (i + k)%len = 4

i = 1 k = 4 len = 7 (i + k)%len = 5

i = 2 k = 4 len = 7 (i + k)%len = 6

i = 3 k = 4 len = 7 (i + k)%len = 0

i = 4 k = 4 len = 7 (i + k)%len = 1

i = 5 k = 4 len = 7 (i + k)%len = 2

i = 6 k = 4 len = 7 (i + k)%len = 3

 

方法2:将阵列反转3次。

反向1:反向整个数组

反转2:将元素从0反转到k。

反转3:从k反转为n。

 

C ++解决方案

#include<iostream>
#include<vector>

using namespace std;


vector<int> rotate_method_1(vector<int> array, int k) 
{
	int len = array.size();
    //take the copy of the array
    vector<int> array_copy(len);
    for (int i = 0; i < len; i++)
    {
        array_copy[i] = array[i];
    }
    
    // Rotate the elements.
    for (int i = 0; i < len; i++)
    {
        array[(i + k)%len] = array_copy[i];
    }
    return array;
}

vector<int> rotate_method_2(vector<int> array, int k) 
{
	int len = array.size();
 
	reverse(array.begin(), array.end()); 
	reverse(array.begin(), array.begin()+k%len); 
	reverse(array.begin()+k%len, array.begin()+len); 


	return array;
}

int main()
{

	std::vector<int> array = {1, 2, 3, 4, 5, 6, 7};
	int k = 4;

	cout<<"Before Rotation "<<endl;

    for (int i = 0; i < array.size(); i++)
    {
        cout <<array[i] << " ";
    }

	cout<<"\n\nAfter Rotation using method 1:"<<endl;

	vector<int> result = rotate_method_1(array, k);

    for (int i = 0; i < result.size(); i++)
    {
        cout <<result[i] << " ";
    }
    cout<<endl;

   	cout<<"\n\nAfter Rotation using method 2:"<<endl;

	result = rotate_method_2(array, k);

    for (int i = 0; i < result.size(); i++)
    {
        cout <<result[i] << " ";
    }
    cout<<endl;

	return 0;
}

 

输出:

Before Rotation

1 2 3 4 5 6 7

After Rotation using method 1:

4 5 6 7 1 2 3

After Rotation using method 2:

4 5 6 7 1 2 3

 

该网站上可用的教程列表:

C编程20+章C ++编程80+章
100多个编码问题数据结构和算法85+章
系统设计20+章Shell脚本编写12章
4g LTE 60+章节最常见的编码问题
5G NR 50+章Linux系统编程20+章
分享
电子邮件
鸣叫
领英
Reddit
绊倒
Pinterest的
上一篇文章
下一篇

关于作者

前开发者教程

每天我们都会讨论竞争性编程问题,请加入我们的网站:   电报频道

ProDeveloperTutorial.com

教程和编程解决方案
版权© 2020 ProDeveloperTutorial.com
从以下课程获得热门课程: 教育性的