zoukankan      html  css  js  c++  java
  • 【编程之美】2.17 数组循环位移

    题目:一个有N个元素的数组 循环右移k位 要求时间复杂度O(N)  只允许两个附加变量

    abcd1234 循环右移4位  变成 1234abcd

    做过 思路  (ATBT)T = BA

    注意,K可能比N大,K也可能是负数(左移),要注意取余处理!!

    #include <stdio.h>
    #include <string.h>
    
    
    void exchange(char * c, int begin, int end)
    {
        char tmp;
        for(; begin < end; begin++, end--)
        {
            tmp = c[begin];
            c[begin] = c[end];
            c[end] = tmp;
        }
    }
    
    int mod(int r, int c)
    {
        if(r >= 0)
        {
            return r % c;
        }
        else
        {
            return c + r % c; //这里 r%c 可以得到一个绝对值小于c的负数 再加上c 得到正数
        }
    }
    void rightRotate(char * c, int clen, int k)
    {
        printf("%s
    ", c);
        k = mod(k, clen);  //注意这里 防止k是负数 或k大于clen !!!!!! 考虑全面很重要
        exchange(c, 0, clen - k - 1);
        exchange(c, clen - k, clen - 1);
        exchange(c, 0, clen - 1);
        printf("%s
    ", c);
    }
    
    int main()
    {
        char c[20] = "hello, every one!" ;
        rightRotate(c, strlen(c), -6);
    
        return 0;
    }
  • 相关阅读:
    容斥原理学习(Hdu 4135,Hdu 1796)
    ACdream 1112
    CodeChef--Cards, bags and coins
    ACdream 1108(莫队)
    Hdu 2586(LCA)
    CodeChef--EQUAKE
    Hackerrank--Mixing proteins(Math)
    Clash Credenz 2014 Wild Card Round题解
    Codeforces 463D
    CodeChef August Lunchtime 2014 题解
  • 原文地址:https://www.cnblogs.com/dplearning/p/4093772.html
Copyright © 2011-2022 走看看