有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m 个数

这篇具有很好参考价值的文章主要介绍了有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m 个数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

这道题实现起来不是很困难,但是用最优的方法去实现,还是有一定的难度,尤其是对于初学者,很难想到最优的方法。每一种方法的时间复杂度和空间复杂度都有所差别,这篇文章主要是在该问题的基础上,分析各种方法的优劣,用空间复杂度,时间复杂度来衡量一个算法好坏。

题目再现

有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m 个数,见图。写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
有n个整数,使前面各数顺序向后移m,c语言,算法,后端

分析

思路一

图示理解

有n个整数,使前面各数顺序向后移m,c语言,算法,后端

算法设计

  • 将arr[len-1]保存在temp;
  • 将剩余数组元素,依次从后向前遍历
    • 进行数据移动 arr[j+1] = arr[j] ;
  • 将最后的数移动到最前面 arr[0]= temp

编程实现

void move1(int* arr, int len, int m) {//arr是数组,len是数组长度,m是需要移动的个数
	int temp,count = 0; //
	while (count < m) { //循环次数控制
		temp = arr[len - 1];
		//进行数据移动
		for (int j = len - 1-1; j >= 0; j--) {
			arr[j + 1] = arr[j];
		}
		arr[0] = temp;
		count++;
	}
}

算法分析

当m为1时,需要访问n个元素,m为2时,需要访问n+n个元素,m为n时,需要访问nn个元素,访问的总次数为n+2n+3n+……nn=n(n+nn)/2,平均次数为(n+nn)/2,所以时间复杂度为O(n^2),没有开辟新的空间,所以空间复杂度为O(1)

思路二

图示理解

有n个整数,使前面各数顺序向后移m,c语言,算法,后端

算法设计

  • i从n-m开始遍历arr,j从0开始遍历brr
    • 将arr中的元素放入brr ,循环赋值m次
  • i从0开始遍历arr,j从上次遍历的位置开始遍历brr
    • 将arr中的元素放入brr ,循环赋值n-m次
  • brr中的值依次赋值给arr

编程实现

//#define SIZE 7
void move2(int* arr, int len, int m) {
	int brr[SIZE] = { 0 };
	int j = 0;//j需要在第一次的赋值基础上再赋值,作用域比i大
	for (int i = len - m; i < len; i++,j++) {
		brr[j] = arr[i];
	}
	for (int i = 0; i < len - m; i++,j++) {
		brr[j] = arr[i];
	}
	for (int i = 0; i < len; i++) {
		arr[i] = brr[i];
	}
}

算法分析

变量i访问了n个元素,变量j也访问了n个元素,一共访问了2n个元素,所以时间复杂度是O(n),由于开辟了n个元素的空间,所以空间复杂度就是O(n)

思路三

图示理解

有n个整数,使前面各数顺序向后移m,c语言,算法,后端

算法设计

  • 将整个数组翻转
  • 将0~m-1的元素翻转
  • 将m~len-1的元素翻转
翻转函数设计
  • i=0开始遍历半个数组
    • 将arr[i]与arr[len-1]交换位置

编程实现

//翻转函数
void reverse(int* arr, int l_index, int r_index) {
	int num = r_index - l_index + 1; //该区间的元素个数
	int temp;
	for (int i = 0; i < num / 2; i++) { //i控制次数
		temp = arr[l_index+i];
		arr[l_index + i] = arr[r_index-i];
		arr[r_index - i] = temp;
	}
}
//交换函数
void move3(int* arr, int len, int m) {
	reverse(arr, 0, len - 1);
	reverse(arr,0,m-1);
	reverse(arr,m,len-1);
}

算法分析

翻转一次,就要访问n个元素,翻转了三次,就是3n,所以时间复杂度为O(n),没有开辟新的空间,空间复杂度为O(1)

程序测试(第三种为例)

void reverse(int* arr, int l_index, int r_index) {
	int num = r_index - l_index + 1; //该区间的元素个数
	int temp;
	for (int i = 0; i < num / 2; i++) { //i控制次数
		temp = arr[l_index+i];
		arr[l_index + i] = arr[r_index-i];
		arr[r_index - i] = temp;
	}
}
void move3(int* arr, int len, int m) {
	reverse(arr, 0, len - 1);
	reverse(arr,0,m-1);
	reverse(arr,m,len-1);
}
int main() {
	int arr[] = {1,2,3,4,5,6,7};
	int len = sizeof(arr) / sizeof(arr[0]);
	int m = 3; 
	printf("翻转之前的数组:");
	for (int i = 0; i < len; i++) {
		printf("%-5d", arr[i]);
	}
	printf("\n");
	printf("翻转之后的数组:");
	move3(arr, len, m);
	for (int i = 0; i < len; i++) {
		printf("%-5d",arr[i]);     
	}
	printf("\n");
	return 0;
}

运行的结果如下

有n个整数,使前面各数顺序向后移m,c语言,算法,后端文章来源地址https://www.toymoban.com/news/detail-809202.html

到了这里,关于有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m 个数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (排序) 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 ——【Leetcode每日一题】

    难度:简单 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。 示例: 输入:nums = [1,2,3,4] 输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。 提示 : 0 = n u m s . l e n g t h = 50000 0 = nums.length = 50000 0 =

    2024年02月12日
    浏览(37)
  • C++读取一行内个数不定的整数的方式

      💯 博客内容:C++读取一行内个数不定的整数的方式 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,有问题请私信 😘 😘 😘 目录 应用情

    2024年02月12日
    浏览(28)
  • python如何判断一个数是整数,浮点数,复数还是字符?

    遇到判断字符类型,上网搜索了一下,整理下来。 (1)判断字符串 python字符串常用的判断函数很多,有如下8种: 1、str.isalnum() 所有字符都是数字或者字母 2、str.isdecimal() 所有字符都是十进制数字 3、str.isdigit() 所有字符都是数字 4、str.isalpha() 所有字符都是字母 5、str.islow

    2023年04月09日
    浏览(25)
  • C++,如何快速的求一个正整数的所有因数的个数?

          首先,让我们看看什么是因数,       定义 :因数是指整数a除以整数b(b≠0) 的商正好是整数而没有余数,我们就说b是a的因数。      好,接下来是问题: 题目描述       给定一个整数n(1n10^9),求出n的因子的个数。      首先我们先看一看 数据范围 。  

    2024年02月12日
    浏览(34)
  • C语言每日一题之整数求二进制1的个数

    今天分享一道题目,用三种方法来求解 二进制1的个数 方法1 我们的十进制除10和取余数就可以得到我们每一位的数字,那我们的二进制也可 以 这是一种方法,另外一种就是我们可以用移位操作符来算 这个方法是不是也是特别妙呢,当然还有更妙的方法,请看!!! 相信看

    2024年02月15日
    浏览(36)
  • 算法:给你一个整数数组 nums 和一个整数k,请你统计并返回该数组中和为 k 的子数组的个数

    Java面试题目录 算法:给你一个整数数组 nums 和一个整数k,请你统计并返回该数组中和为 k 的子数组的个数 使用前缀和来实现。在保存累加和的数组preSum中,找坐标大的元素与坐标小的元素差值正好为k的个数。 leecode地址:. - 力扣(LeetCode) 直接在力扣找了个写好的答案。

    2024年01月24日
    浏览(37)
  • c++一级 输入三个数,按照从小到大的顺序输出

    这个题是2022年9月份c++一级的真题,它说难不难,说不难也难,评判标准主要看学生学到哪种程度以及 使用的是哪种方法。 首先来看用最基础的判断怎么做: 这是用 排列组合 的方式来做,有的同学也会直接两两个数进行判断,但那样实在太麻烦了,需要写很多层循环嵌套。

    2024年02月15日
    浏览(48)
  • C语言刷题系列——6.(递归)实现顺序输出整数

    ) 函数printdigits应将n的每一位数字从高位到低位顺序打印出来,每位数字占一行。 输入一个数(比如12345),想要打印出每一位,可以拆解成: 先打印1,再用函数printdigits()对2345执行相同的操作 打印2,再用函数printdigits()对345执行相同的操作 打印3,再用函数printdigits()对45执

    2024年02月02日
    浏览(27)
  • 【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转

    ========================================================================= 个人主页直达: 小白不是程序媛 LeetCode系列专栏: LeetCode刷题掉发记 ========================================================================= 目录 LeetCode 58.最后一个单词的长度 LeetCode169.多数元素 LeetCode 136.出现一次的数字 LeetCode 7.整数

    2024年02月08日
    浏览(36)
  • 编写程序,输入一个正整数n,输入n个数,生成一个n*n的矩阵。其中矩阵中第1行是输入的n个数,以后每一行的内容都是上一行循环左移一个元素构成的。

    假设n=5,输入的5个数为2、5、8、4、9,则形成的矩阵为: 2 5 8 4 9 5 8 4 9 2 8 4 9 2 5 4 9 2 5 8 9 2 5 8 4 直接将输入的数储存为数列的第一行: 在循环时,每行的最后一个数是上一行的第一个数,与之前的规律不同,要单独写: 完整的代码:

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包