zoukankan      html  css  js  c++  java
  • 字符串循环右移-c语言

    一个长度为len的字符串,对其循环右移n位

    [期望]
    char str[] = "abcdefg";
    右移3次后,变成"efgabcd"

    [思路]

    思路1.

    如果用每移动一次,就要把整个字符串整体移动一次的方法,显得太费劲了。
    我们可以用空间换时间,通过内存拷贝来实现。
    需要新申请一块相同大小的内存,把原字符串的后n个字节拷贝到它的开始地址,把原字符串的前(len-n)个字节拷贝到它的(开始地址+n)处。

    为便于查看结果,我们先定义一个打印字符串的函数void print_str(char *str);

    void print_str(char *str)
    {
        int i,len;
        if (str == NULL) {
            return;
        }
        len = strlen(str);
        for(i=0; i<len; i++) {
            printf("%c",str[i]);
        }
        printf("
    ");
    }
    print_str

    思路1的代码实现:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    void print_str(char *str)
    {
        int i,len;
        if (str == NULL) {
            return;
        }
        len = strlen(str);
        for(i=0; i<len; i++) {
            printf("%c",str[i]);
        }
        printf("
    ");
    }
    
    int str_rshift_1(char *str, int n)
    {
        int len;
        char *tmp;
        
        len = strlen(str);
        if (len < n) {
            return 1;
        }   
    
        tmp = (char *)malloc(len);
        if (tmp == NULL) {
            return 1;
        }   
    
        memcpy(tmp, str+len-n, n); 
        memcpy(tmp+n, str, len-n);
        memcpy(str, tmp, len);
        free(tmp);
        str[len] = '';
        return 0;
    }
    
    void str_rshift_1_test()
    {
        char str[] = "abcdefg";
        str_rshift_1(str, 3);
        print_str(str);
    }
    
    void main()
    {
        str_rshift_1_test();
    }
    View Code

    思路2.

    来自《编程珠玑》里的算法,利用字符串的逆序来实现。
    比如字符串"abcdefg",要循环右移3位,那么这个字符串可以分为2部分:
    前半部分:"abcd" 和后半部分 "efg"。
    我们先把前半部分逆序变成   ->         "dcba"
    再把后半部分逆序变成->                        "gfe"
    这时整体字符串应该是                     "dcbagfe"
    我们再对整个字符串逆序一遍,结果-> "efgabcd"。
    bingo,循环右移完成。

    总结一下,总共要进行3次逆序:前半部分逆序,后半部分逆序,整体逆序。
    逆序用到的函数原型是void str_reverse(char *str, int left, int right);它的实现在这里

    思路2的代码实现:

    int str_rshift_2(char *str, int n)
    {
        int len = strlen(str);
    
        if (len < n) {
            return 1;
        }   
    
        str_reverse(str, 0, len-n-1);
        str_reverse(str, len-n, len-1);
        str_reverse(str, 0, len-1);
        return 0;
    }
    
    void str_rshift_2_test()
    {
        
        char str[] = "abcdefg";
        str_rshift_2(str, 3); 
        print_str(str);
    }
    
    void main()
    {
        str_rshift_2_test();
        
    }
    View Code
  • 相关阅读:
    浅析c#中new、override、virtual关键字的区别
    数据解析1113
    Silverlight中xaml之间的跳转方案之一
    silverlight读取client文件的完整路径
    (Transfered)WPF Tutorial:Beginning
    数据解析1112
    邮件发送1
    TortoiseSVN Settings Subversion
    德信无线10Q4净利润同比增进187%
    欧盟中止对我数据卡双反调查
  • 原文地址:https://www.cnblogs.com/bugchecker/p/3618661.html
Copyright © 2011-2022 走看看