面试_java:数组:旋转数组:rotate array(189)

  • {1,2,3,4,5};k=2旋转
    第一次:5,4,3,2,1
    第二次:4,5,3,2,1
    第三次:4,5,1,2,3

  • 复杂度:O(N)

import java.util.HashMap;
import java.util.Scanner;

public class Solution {

    public int[] rotate(int[] numbers,int k){
        if(numbers.length ==0 || k%numbers.length==0)
            return numbers;
        k = k % numbers.length;
        reverse(numbers,0, numbers.length-k-1); //反转整个数组
        reverse(numbers,numbers.length-k,numbers.length-1);  //反转k个
        reverse(numbers,0,numbers.length-1); //反转剩下的数组

        return numbers;

    }

    public void reverse(int[] A, int start,int end){
        while(start < end){
            //交换start和end
            int temp=A[start];
            A[start] =A[end];
            A[end] = temp;
            ++start;
            --end;
        }

    }

    public static void main(String[] args) {        
        Solution s = new Solution();        
        //输入        
        Scanner cin = new Scanner(System.in);
        while(cin.hasNext()){

             int n = cin.nextInt();
             int[] numbers = new int[n];
                for (int i = 0; i < numbers.length; ++i) {
                    numbers[i] = cin.nextInt();
                }
             int k = cin.nextInt(); 

             //算法    
             int[] res = s.rotate(numbers, k);

          //输出
             for(int r:res)
                 System.out.println(r+"\t");            
        }

    }
}

c++


// 单纯数组的输入输出
#include <iostream>
using namespace std;

#define  N  100

class Solution {
private:
    void reverse_array(int nums[], int a, int b) {
        while (a < b) {
            swap(nums[a], nums[b]);
            ++a;
            --b;
        }
    }

public:
    void rotate(int nums[], int n,int k) {

        if (n == 0 || k % n == 0)
            return;
        k = k % n;
        reverse_array(nums, 0, n - k - 1);
        reverse_array(nums, n - k, n - 1);
        reverse_array(nums, 0, n - 1);
    }
};

int main() {

    Solution  s;
    int n;
    int test[N];    

    cin>>n;
    memset(test,0,sizeof(test));

    for(int i=0;i<n;i++)
        cin>>test[i];

    int k; //旋转的个数
    cin>>k;

    s.rotate(test,n,k);

    //输出
    for (int i = 0; i < 5; ++i)
        cout << test[i] << ' ';
    cout << endl;

    return 0;

}
/*
int main() {
    int num[] = {1, 2, 3, 4, 5};
    Solution s;
    s.rotate(num, 5, 3);
    for (int i = 0; i < 5; ++i)
        cout << num[i] << ' ';
    cout << endl;
    return 0;
}*/
  • vector的写法
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;

#define  N  100



class Solution {

private:
    void reverse_array(vector<int> &nums, int a, int b) {
        while (a < b) {
            swap(nums[a], nums[b]);
            ++a;
            --b;
        }
    }

public:
    void rotate(vector<int>& nums, int k) {
        int n=nums.size();
        if (n == 0 || k % n == 0)
            return;
        k = k % n;
        reverse_array(nums, 0, n - k - 1);
        reverse_array(nums, n - k, n - 1);
        reverse_array(nums, 0, n - 1);

    }
};




int main() {

    Solution  s;

    vector<int> testRotateArray;

    int n,t;
    cin>>n;


    while(n--){
        cin>>t;
        testRotateArray.push_back(t);
    }

    int k; //旋转的个数
    cin>>k;

    s.rotate(testRotateArray,k);

    //输出
    for(vector<int>::iterator it=testRotateArray.begin(); it!=testRotateArray.end();it++)
        cout<<*it<<endl;

    return 0;

}
/*
int main() {
    int num[] = {1, 2, 3, 4, 5};
    Solution s;
    s.rotate(num, 5, 3);
    for (int i = 0; i < 5; ++i)
        cout << num[i] << ' ';
    cout << endl;
    return 0;
}*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值