【考研·数据结构】408真题 (2010年42题) 的两种解法】

2010

题目
设将n(n>1)个整数存放到一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数组由(X0,X1, … Xn-1)变换为(Xp,Xp-1, … Xn-1,X0,X1, … Xp-1)。要求:

(1)给出算法的基本设计思想。

(2)根据设计思想,采用C、C++或JAVA语言描述算法,关键之处给出注释。

(3)说明你所涉及算法的时间复杂度和空间复杂度。

  • 暴力解:

    • 将不需要移出的元素依次从头填入
    • 然后把移出的元素拼接到数组后面
    • 时间复杂度o( n )
    • 空间复杂度o( p )
    #include<iostream>
    using namespace std;
    const int n = 10;
    const int p = 5;
    void reverse(int* R, int n, int p)
    {
    
    	int* arr = new int[n];
    	//int arr[n]
    	int k = 0;
    	for (int i = p; i < n; i++)
    	{
    		arr[k++] = R[i];
    	}
    	for (int i = 0; i < p; i++)
    	{
    		arr[k++] = R[i];
    	}
    
    	for (int i = 0; i < n; i++)
    	{
    		cout << arr[i] << " ";
    	}
    }
    int main()
    {
    
    	int R[n] = { 1,2,3,4,5,6,7,8,9,10 };
    	reverse(R, n, p);
    
    }
    
    
  • 最优解

    • 靠转置实现
      • 核心就是将收尾两个元素调换位置
      • 前面转置
      • 后面转置
      • 全部转置
    • 时间复杂度o(n)
    • 空间复杂度o(1)
      #include<iostream>
      using namespace std;
      const int n = 10;
      const int p = 5;
      void reverse(int* arr, int l, int r)//arr是数组首地址
      {
      	for (int i = 0; i < (r - l + 1) / 2; i++)
      	{
      		int temp = arr[l + i];
      		arr[l + i] = arr[r - i];
      		arr[r - i] = temp;
      	}
      }
      int main()
      {
      
      	int R[n] = { 1,2,3,4,5,6,7,8,9,10 };
      	reverse(R, 0, p - 1);
      	reverse(R, p, n - 1);
      	reverse(R, 0, n - 1);
      	for (int i = 0; i < n; i++)
      	{
      		cout << R[i] << " ";
      	}
      
      }
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Muuuzi丶

您的鼓励是我创作的无限动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值