面试题:移动数组的元素

加qq 1126137994 一起学习更多技术!!!

描述
试设计一个算法,将数组a中的元素a[0]至a[n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)。

输入
先输入一个大于1且小于100的正整数n,再输入n个整数存到数组a中,最后输入一个小于n正整数k,

输出
循环移动k位后输出。

输入样例
5
2 6 15 39 5
3

输出样例
15 39 5 2 6

如果做题的功底不好,一开始只会想到额外申请一个大小为k的数组,将原数组需要右移的k后面k个元素放到申请的数组里,然后将前面剩余的元素右移k位,再把额外数组的k个元素放到原数组的前k位。
这样做,浪费的空间,当需要移动的个数比较大,就会浪费更大的空间,所以面试官肯定不会满意!!!

其他算法:
应该这样做:
1、将整个数组置换(a[i]<=>a[n-1-i])

2、将前k个数置换

3、将后n-k个数置换

下面是我自己写的程序:

#include<iostream>using namespace std;//交换a[i]与a[n-i-1]
void swapa(int* a,int n)
{for (int i = 0; i <= (n - 1) / 2; i++){int temp;temp = a[i];a[i] = a[n-1-i];a[n - 1 - i] = temp;}}//数组的前k个数置换a[i]与a[k-1-i]
void swappre_k(int* a,int k)
{for (int i = 0; i <= (k - 1) / 2; i++){int temp;temp = a[i];a[i] = a[k-1-i];a[k - 1 - i] = temp;}
}void swapafter_k(int* a,int n, int k)
{int m = n - 1;for (int i = k; i <= ( n- 1 + k) / 2; i++){int temp;//int m = n - 1;temp = a[i];a[i] = a[m];a[m] = temp;m--;}
}int main()
{int a[100], n, k;scanf_s("%d",&n);for (int i = 0; i < n; i++){scanf_s("%d",&a[i]);}scanf_s("%d",&k);cout << " 移动前数组元素: " << endl;for (int i = 0; i < n; i++){cout << a[i] << ' ';}cout << endl;//首先是整个数组置换int* p = a;swapa(p,n);//然后是前k个数置换swappre_k(p,k);//最后是后n-k个数置换swapafter_k(p,n,k);cout << " 移动后数组元素: " << endl;for (int i = 0; i < n; i++){cout << a[i] << ' ';}getchar();return 0;
}

阅读性不是很好!再看看一个简单的写法:

#include<iostream>using namespace std;void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}void swap_reserve(int* a, int* b)
{while (a < b)swap(a++,b--);
}void shift(int* a, int n, int k)
{swap_reserve(a,a+n-1);swap_reserve(a,a+k-1);swap_reserve(a + k, a + n - 1);
}//数组的前k个数置换a[i]与a[k-1-i]int main()
{int a[100], n, k;scanf_s("%d",&n);for (int i = 0; i < n; i++){scanf_s("%d",&a[i]);}scanf_s("%d",&k);cout << " 移动前数组元素: " << endl;for (int i = 0; i < n; i++){cout << a[i] << ' ';}cout << endl;int* p = a;shift(p,n,k);cout << " 移动后数组元素: " << endl;for (int i = 0; i < n; i++){cout << a[i] << ' ';}getchar();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

n个字符串按照字典序排列

题目描述 给定n个字符串&#xff0c;请对n个字符串按照字典序排列。 输入描述: 输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。 输出描述: 数据输出n行&#xff0c;输出结果为按照字典序排列的字符串。 输入例子:…

二叉树的层序遍历详细讲解(附完整C++程序)

加qq1126137994 微信liu1126137994 一起学习更多技术 1、原理&#xff1a; 层序遍历所要解决的问题很好理解&#xff0c;就是按二叉树从上到下&#xff0c;从左到右依次打印每个节点中存储的数据。如下图&#xff1a; 按层序遍历的原则&#xff0c;打印顺序依次应该是&…

不同DPI下窗体的自适应的有关注意点(转)

不同DPI下窗体的自适应的有关注意点&#xff08;转自&#xff1a;http://hi.baidu.com/superkinger/blog/item/79e047ec6c80563526979197.html&#xff09; 1. 在设计窗体的时候需要考虑是否允许程序在不同DPI自适应窗体&#xff0c;不自适应的优点是在不同的DPI下看到的…

【C++深度剖析教程30】C++中抽象类和接口

加qq1126137994 微信&#xff1a;liu1126137994 1、面向对象中的抽象概念; 在现实中&#xff0c;需要知道具体的图形类型才能知道如何求面积&#xff0c;但是对于抽象的‘图形’&#xff0c;我们是没法求其面积的&#xff0c;而且对其求面积也是没有意义的&#xff1a; cl…

有效沟通力思维导图

有效沟通&#xff0c;适用于生活和工作中&#xff0c;甚至是孩子教育上面&#xff0c;分享一下&#xff1b;

[转]Microsoft Solution Framework 微软解决方案框架结构

本文转自&#xff1a;http://baike.baidu.com/view/1291436.htmMSF&#xff08;Microsoft Solution Framework&#xff09;微软解决方案框架结构是一组建立、开发和实现分布式企业系统应用的工作模型、开发准则和应用指南。它帮助企业融合商业和技术的目标&#xff0c;降低采用…

指针的大小与什么有关

指针的大小与什么有关&#xff1f; cpu位数&#xff08;32位数4字节&#xff0c;64位数8字节&#xff09;操作系统位数&#xff08;32位数4字节&#xff0c;64位数8字节&#xff09;编译器的位数&#xff08;32位数4字节&#xff0c;64位数8字节&#xff09; 当上述3种位数不…

数据结构思维导图

学习是一个不断渐进的过程&#xff0c;最近整理了一下数据结构思维导图&#xff0c;分享一下&#xff0c;后续更新中 总结&#xff1a;算法实际上属于&#xff0c;数据建模&#xff0c;首先是问题的抽象&#xff0c;采用数学公式来表示&#xff08;数据建模&#xff1a;将问题…

(转)代理模式(Proxy)

原文地址&#xff1a;http://www.cnblogs.com/QinBaoBei/archive/2010/05/18/1737866.html 为了深刻点理解代理模式&#xff0c;我们先来看一个 Demo &#xff0c; 首先这个 Demo 是用来测试 QQ 号码是否在线&#xff0c; 这里涉及到的内容是 Web 服务的使用&#xff0c; 这个 …

【C++深度剖析教程31】被遗弃的多重继承

加qq1126137994 微信&#xff1a;liu1126137994 C中是否允许一个类继承多个父类&#xff1f; C支持编写多重继承的代码&#xff1a; 一个子类可以拥有多个父类子类拥有所有父类的成员变量子类继承父类所有的成员函数子类对象可以当做任意父类对象使用 多重继承的语法规则&a…

zookeeper思维导图

之前用word文档记笔记&#xff0c;但是没有思维导图清晰&#xff0c;又整理了一下&#xff0c;分享一下&#xff1b;

管理软件本质论

我们上管理软件到底是为了什么&#xff1f;1 为员工提供自动化工具&#xff0c;可以让他们节省出更多的时间可以做更多的工作&#xff1f;2 可以通过管理软件的互联网联网特性或局域网联网特性&#xff0c;让部门和部门之间、总部和分公司之间按业务流程通常运营&#xff1f;2 …

【C++深度剖析教程32】new/malloc区别 delete/free区别

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 1、new与malloc的区别&#xff1a; new是关键字&#xff0c;它是C语言的一部分&#xff0c;而malloc是由C库提供的函数new分配的内存的单位是具体的类型大小&#xff0c…

redis 思维导图

之前整理的redis 思维导图&#xff0c;分享一下&#xff0c;后续持续更新;

软件汉化教程

看到网上经常有人问汉化方面的东西&#xff0c;我今天也来灌水一篇&#xff0c;来个汉化扫盲教程。写的不好的地方欢迎大家指正&#xff01;OK&#xff0c;现在我们进入正题。我这里所说的汉化&#xff0c;是指汉化 Windows 下的 PE 文件&#xff0c;把其他语言界面的程序翻译为…

图的DFS深度遍历

最近复习了一下图的内容&#xff0c;记录一下&#xff0c;后续添加详解&#xff08;无向图的深度遍历&#xff09; package com.qey.learn;import java.util.ArrayList; import java.util.Arrays;/*** ClassName graph* Description* Author qianxl* Date 2021-03-06 17:18* V…

【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 问题一&#xff1a;构造函数与析构函数可以成为虚函数么&#xff1f; 答案&#xff1a; 1、构造函数不可以成为虚函数 因为在构造函数执行结束后&#xff0c;虚函数表…

网站切图初学

先做一个简单的说明为什么选择Photoshop软件而没有选择Firework软件。Friework Dreamweaver Flash号称网页制作三剑客&#xff0c;Friework与Dreamwaver整合得更为紧密&#xff0c;在这里只所以选择photoshop只是因为我的偏好&#xff0c;况且我对 firework软件使用的次数很少&…

【C++深度剖析教程34】C++中的强制类型转换dynamic_cast

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; C中的继承中&#xff0c;如何使用强制类型转换&#xff1f; 知识点&#xff1a; dynamic_cast是与继承相关的类型转换关键字dynamic_cast要求相关的类中必须有虚函数dy…