`
128kj
  • 浏览: 600368 次
  • 来自: ...
社区版块
存档分类
最新评论

2010计算机考研题:循环左移数组

阅读更多


一、第一种方法,都想得到的。
static int[] LeftShift1(int[] arr,int K){//K为循环左移位数  
   int N=arr.length;
   int[] new_arr=new int[N]; //新开一个数组,空间复杂度O(n)
   for(int i = 0; i <N; i++)  
       new_arr[i] = arr[(K+i)%N ];  
    return new_arr;  
 }  



二、利用“翻转”完成优化,《编程之美》上的算法

  考虑一下数组A中元素1234567循环左移2位到底是怎么个情况!!!将数组A分成两个部分:A[0~k-1] 和 A[k~n-1] ,(12与34567)将这两个部分分别翻转,然后放在一起在翻转(逆序)。具体是这样的:

(1)翻转12:12 ---> 21

(2)翻转34567:  34567 ---> 76543

(3)一起翻转2176543:2176543 --->3456712

//翻转b~e
static void Reverse(int[] arr, int b, int e){  
     while(b < e){  
       int temp = arr[e];  //只需新开一个辅助空间
        arr[e] = arr[b];  
        arr[b] = temp;  
        b++;
        e--;
    }  
   }  

   //左移K位
   static void  LeftShift(int[] arr, int K){  
    int N=arr.length;

    //如果K>N,取K=K%N。
     
    K %= N;  
    Reverse(arr, 0, K - 1);  
    Reverse(arr, K, N - 1);  
    Reverse(arr, 0, N - 1);  
   } 


第一种算法有O(n)的空间复杂度,第二种有O(1)的空间复杂度,两种算法时间复杂度同为O(n)。

测试程序:
  public class Test{

   //方法一 
   static  int[]  LeftShift1(int[] arr,int K){//K为循环左移位数  
        int N=arr.length;
        int[] new_arr=new int[N];    
        for(int i = 0; i <N; i++)  
            new_arr[i] = arr[(K+i)%N ];  
        return new_arr;  
    }  

   static void print(int[] arr){
     for(int i=0;i<arr.length;i++)
       System.out.print(arr[i]+"  ");
     System.out.println();
  }

  //翻转b~e
   static void Reverse(int[] arr, int b, int e){  
     while(b < e){  
       int temp = arr[e];  
        arr[e] = arr[b];  
        arr[b] = temp;  
        b++;
        e--;
    }  
   }  

   //方法二
   static void  LeftShift(int[] arr, int K){  
    int N=arr.length;
    K %= N;  
    Reverse(arr, 0, K - 1);  
    Reverse(arr, K, N - 1);  
    Reverse(arr, 0, N - 1);  
   } 
  
    public static void main(String[] args){
        int[] a={1,2,3,4,5,6,7};  
        print(a);
        int[] new_arr = LeftShift1(a,2);  
        print(new_arr);

       // Reverse(a,2,5);
        LeftShift(a, 4);  
        print(a);
    }  
 }



运行:
C:\ex>java  Test
1  2  3  4  5  6  7
3  4  5  6  7  1  2
5  6  7  1  2  3  4

  • 大小: 48.8 KB
分享到:
评论

相关推荐

    C语言考研试题和历年考试题

    C语言是计算机科学领域基础且重要的编程语言,尤其在考研中占据着重要地位。这篇资料集包含的是“C语言考研试题和历年考试题”,对于准备考研的学子来说是一份宝贵的资源。下面我们将深入探讨C语言的一些核心知识点...

    2012年重庆邮电大学计算机考研复试试题(回忆版)1

    8. **数组元素循环左移**:这个操作通常用于数组数据的位移处理,比如在密码学中的移位加密。通过循环移动数组元素,将第一个元素移到数组末尾,其他元素依次前移一位。 9. **判断素数**:素数是只有1和本身两个正...

    2010考研计算机统考大题详细答案

    从给定的文件信息中,我们可以提取出三个主要的知识点:散列表的构建与分析、数组的循环左移算法设计及实现、以及基于16位计算机的指令系统设计与解析。下面将对这三个知识点进行详细阐述。 ### 散列表的构建与分析...

    考研_计算机_数据结构_高分笔记

    以数组循环左移为例,题目要求将数组中的元素循环左移P个位置。解决此类问题的关键在于理解算法的逻辑和时间复杂度。如上述示例所示,通过三次逆置操作可以实现数组元素的循环左移,这种方法的时间复杂度为O(n),...

    2012年计算机考研数据结构高分笔记

    - **示例**:例如,以下是一个将一维数组中的序列循环左移P个位置的示例算法。该算法采用了简洁明了的方式,去除了不必要的注释和标准库引入。 ```cpp void Reverse(int R[], int l, int r) { int i, j; int temp...

    福建师范大学614计算机基础2021年考研专业课初试大纲.pdf

    ### 福建师范大学614计算机基础2021年考研专业课初试大纲解析 #### 一、概述 福建师范大学2021年的计算机基础考研初试大纲旨在考查学生在C语言程序设计、数据结构以及数据库原理等方面的基础知识与技能。该大纲...

    数据结构考研知识点总结.doc

    3. 〔10 年〕设将 n(n,1)个整数存放到一维数组 R 中,试设计一个在时间和空间两方面尽可能有效的算法,将 R 中保有的序列循环左移 P〔0Pn﹤ ﹤ 〕个位置,即将 R 中的数据由〔X0 X1 ……Xn-1〕变换为〔Xp Xp+1 ……...

    数据结构考研复习策略PPT学习教案.pptx

    在掌握了知识要点后,应通过专项练习来巩固,例如PPT中提到的循环左移数组的问题,要求设计一个算法在O(n)的时间复杂度和O(1)的空间复杂度下完成。这需要理解和运用位运算、数组操作等技巧。 最后,做真题和模拟题...

    最新408真题及其他资料

    2. 循环左移一维数组中的元素,这里通过分段逆置数组的方式来解决,是一个高效的时间和空间复杂度的解法。 3. 求两个等长升序序列的中位数问题,采用二路归并思想来解决问题,这是合并排序中的一个步骤,体现了...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究...

    C语言专项精讲课程讲义

    - 多层循环用于处理二维数组或需要嵌套操作的情况。 **break 和 continue** - `break` 用于立即退出循环。 - `continue` 用于跳过当前循环中的剩余代码并继续下一次循环。 #### 第六章 数组 **一维数组** - 定义...

    一些C语言的编程题目

    C语言作为计算机科学的基础语言,对于考研和面试的准备至关重要。以下将对一些常见的C语言编程题目进行详细讲解,帮助读者深入理解和应用C语言。 一、基础语法篇 1. 变量声明与类型转换:在C语言中,变量必须先...

Global site tag (gtag.js) - Google Analytics