不引入新的数组,实现数组元素交换位置函数

近期遇到一道C++的面试题。要求不引入新的数组,实现数组元素交换位置函数,看似挺简单的,却还是花费了我不少时间。这里记录下来。给大家一个简单的思路。题目的具体要求是:

不引入新的数组。实现数组元素交换位置函数:void swap(int a[], int m, int n);比方。设m为3,n为4。a中的数据为:1 2 3 4 5 6 7。函数运行后,a中的数据为:4 5 6 7 1 2 3。

这里的关键是不引入新的数组,并且尽量使用较少的额外变量。我的思路是採用“倒叙追踪法”,利用一个额外变量进行两个数的swap。

贴一下代码。大家有什么更好的方法能够交流一下。

#include <iostream>

#include <unistd.h>

using namespace std;

int judge_pos(int i,int m,int n)

{

if(i>=0 && i<m)

{

return i+n;

}

else if(i>=m && i<(m+n))

{

return i-m;

}

else

{

return -1;

}

}

int main()

{

int num_of_data;

int i_array[1024];

int m,n;

cout << "How many numbers do you want to input: ";

cin >> num_of_data;

cout << "Input the numbers,separate with space: " << endl;

for(int i=0;i<num_of_data;i++)

{

cin >> i_array[i];

}

cout << "Input m and n,separate with space。 " << endl;

cin >> m >> n;

int i = 0;

while(i_array[i]>=0)

{

for(int j=0;j<(m+n);j++)

{

if(judge_pos(j,m,n)==i)

{

if(i_array[j]>0)

{

int temp = i_array[i];

i_array[i] = -i_array[j];

i_array[j] = temp;

i=j;

break;

}

else

{

i_array[i] *= (-1);

i=j;

break;

}

}

}

}

for(int i=0;i<num_of_data;i++)

{

if(i<(m+n))

{

i_array[i] *= (-1);

}

cout << i_array[i] << " ";

}

return 0;

}

时间: 2024-08-09 00:35:28

不引入新的数组,实现数组元素交换位置函数的相关文章

Java泛型01--任意数组中两元素交换

package com.zl.generic; /** * 交换“任意”数组 中两个元素 */ public class GenericSwapArray { public static void main(String[] args) { swap(new String[]{"1","2","3"},1,2); } public static <T> T[] swap(T[] t,int i,int j) { System.out.

删除数组中某个元素

需求:已知一个数组,删除其中某个元素,其它向左移,最后一位补null值 分析: 1.找出要删除元素的下标,找个变量接收 2.此位置元素后面的元素依次向左移一位 3.补齐最后一位赋值null 4.输出新数组 /** * */ package com.cn.u4; /** * @author Administrator *删除数组中某个元素值 */ public class DelArray { public static void main(String[] args) { //定义数组 Stri

C++中的数组array和vector,lambda表达式,C字符串加操作,C++中新类型数组(数组缓存),多元数组,new缓冲

 使用C++风格的数组,不需要管理内存. array要注意不要溢出,因为它是栈上开辟内存. array适用于任何类型 #include<iostream> #include<array> #include<vector>   //C++的标准库 #include<string>   //C++字符串 #include <stdlib.h> using  std::array; //静态数组,栈上 using std::vector; //动态

[经典面试题]输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。

[题目] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1. [分析] 这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组的特性,我们应该能找到更好的解法. 我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************

移除数组中的元素

题目分析:移除数组中的元素可以分为两种情况, 1,不对原数组进行操作: 不对原数组进行操作的,可以新建一个数组,利用数组的栈方法 push,循环数组中的元素,把不等于特定元素的加入新数组. function remove(arr, item) {var res=[];for(var i=0;i<arr.length;i++){if(arr[i]==item){continue}else{res.push(arr[i]);}}return res; } 2,对原数组进行操作:可以利用数组的操作方法

找出两个数组的相同元素,最优算法?

在做新旧接口交替过程中,遇到了老接口和新接口json数据有些不一致的情况,需要比较两个json对象,把相同的元素赋其中一个json对象中变量的值.而且其中一个json最后输出格式还需要改变下属性名,思来想去觉得和"找出两个数组相同元素"很像,所以做下总结. "有一个数组A{0,2,3,5}和一个数组B{3,5,6,2,1,1},找出这两个数组相同元素." 一开始抽象出这道题时,脑海里浮现出最简单粗暴的方法,逐一比较. //最简单粗暴的做法,逐个比较,时间复杂度为(B

数组的创建/查找数组里面的内容/添加数组中元素/使用指定的字符串把数组链接起来/判断数组内是否有指定的数组元素/四种遍历进行输出数组中的元素有哪些

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //创建数组 //1.快速创建数组@[] NSArray*[email protected][@"month",@"tue",@" wed",@"fir"]; //2,创建空的数组 NSArray*arr=[[NSArray a

去除数组中重复元素

问题 统计一个一维数组中的各个元素的个数,然后删除多出来的重复元素,并输出结果. 例如:[1,2,2,2,3,3,3,3,3]-->[1,2,3] 解决思路 将重复元素的列表中的重复元素进行统计,并将统计结果放在dictionary中,key为元素,value为该元素的个数 然后通过for获取key,得到一个新的列表,就是没有重复元素的列表 解决(Python) #!/usr/bin/env python #coding:utf-8 def count_element(one_list): el