专栏首页Aloys的开发之路不引入新的数组,实现数组元素交换位置函数

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

         最近遇到一道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;
 }
 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 华为面试题——一道关于指针方面的编程题(C/C++)

        int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数...

    用户1221057
  • 判断一个数是不是2的幂

    我们经常会遇到这样一个问题,就是判断某个数据是否为2的n次方(1,2,4,8,16...)。例如如果用户输入的不是2^n,则要求用户重新输入。为了说明这种判断算...

    用户1221057
  • C语言中随机数相关问题

    用C语言产生随机数重要用到rand函数、srand函数、及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明。 int rand(void)...

    用户1221057
  • 最大连续子序列和(最大子数组和)四种最详细的解法

    解法1:穷举暴力法 枚举左端点跟右端点,然后遍历更新所有的子序列和,最终得到结果就是最大的

    用户7727433
  • 神奇的 ViewDragHelper,让你轻松定制拥有拖拽能力的 ViewGroup

    相信这种效果大家都见过吧?我第一次见到这样的效果时,心里也痒痒的,急于想实现这种功能,后来因为拖延症的问题,就一直没有去弄这件事。现在这段时间,工作比较轻...

    Frank909
  • 浙大版《C语言程序设计(第3版)》题目集 习题5-4 使用函数求素数和

    其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数m≤n。

    C you again 的博客
  • 常见指针定义解读

    最近做的C/C++技术面试比较多,发现了一些共同的问题,对于如下所示的指针认识,多数面试者都答错了,作为过来人,这种情况还可以理解的,放在一起确实有些复杂。 ...

    一见
  • 浙大版《C语言程序设计(第3版)》题目集 习题4-6 水仙花数

    水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

    C you again 的博客
  • leetcode题解 | 78. 子集

    这个题目很容易想到使用DFS的方式来解决,因为组合的题容易产生转移方程,这样也是没有什么问题的。

    ACM算法日常
  • 洛谷P2763 试题库问题(最大流)

    attack

扫码关注云+社区

领取腾讯云代金券