zoukankan      html  css  js  c++  java
  • 字符串循环移位

    再看面试题时 出现了一个字符串左右移动循环的问题,看了一遍还没有弄懂,就发了点时间来看了一下字符数组与字符指针的问题,最终还是得到解决,呵呵,只要肯发功夫,还是会有收获的

      例如:有一组char的字符串:abcdefghijk 。你要循环左移3位变成ijkabcdefgh(也有写出ijkabcdefghi);或右移三位变成defghijkabc(也有写成cdefghijkabc);

       首先我们来解决字符串循环左移的问题:

    方法一:利用已有的字符串函数。

    #include<stdio.h>

    #include<string.h>

    void rightloop(char *a, int n);

    main()

    {

    char a[100];   int n;

    printf("请输入要循环的字符串: ");

    scanf("%s",a);

    printf("请输入要循环字符串的位数: ");

    scanf("%d",&n);                                        \以上代码也可以直接赋初值,我考虑的是一般情况\

    void rightloop(a,n);                                     \本例以a[]="abcdefghijk", n=3为例讲解\

    printf"输出循环右移的字符串:%s ",a);

    }

    void rightloop(char *a, int n)

    {

    char b[100];     \数组b要做的够大即可\

    int m;

    m=strlen(a)-n;               \求出除去要循环右移之后剩下的字符的个数\

    strcpy(b,a+n);            \ a+na代表a[0]的地址再加上n,表示要把a[n]之后的字符串(即那些不用循环右移的字符,共有m个)复制到数组b中。这时b[]="defghijk" \

    strcpy(b+m,a);                  \ b+m, 因为上面已经把没有循环的m个字符赋给了b,所以b[m]之前的不能在赋值了,只能把a的全部字符串赋给b[m]之后的空间了。这时b[]="defghijkabcdefghijk"\

    *(b+strlen(a))='';               \这里是问题的关键,要根据a字符串的长度来舍弃b数组中多余的字符串,并给数b加结束符。这时b[]="defghijkabc";\

    strcpy(a,b);                                \把数组b中调整好的字符串重新赋给数组a\

    }

    方法二:就是用简单的c语句;

    #include<stdio.h>

    void rightloop(char , int )

    main()

    {

    char a[100];   int n;

    printf("请输入要循环的字符串: ");

    scanf("%s",a);

    printf("请输入要循环字符串的位数: ");

    scanf("%d",&n);                                        \以上代码也可以直接赋初值,我考虑的是一般情况\

    void rightloop(a,n);                                    \本例以a[]="abcdefghijk", n=3为例讲解\

    printf"输出循环右移的字符串:%s ",a);

    }

    void rightloop(char a[ ], int n)

    {

           int i=0,j=0,k=0;

            int m; char b[100];

    while(a[i]!='')

            { i++; }     \这里用i来计算数组a中字符串的大小;\

    while(a[n]!='')

    {

         b[j]=a[n]; j++; n++;

    \这里是把不需要循环右移的字符串赋值到数组b中;b[ ]="defghijk"\

    while(a[k]!='')

    {

        b[j]=a[k]; j++; k++;

    }                 \因为上一个while循环中,数组b已经赋值到b[j]了。所以这里直接从b[j]开始把数组a中的字符串全部赋值到数组b[j]以后的空间中;b [ ]="defghijkabcdefghijk";\

    b[i]='';      \通过用数组a中字符串的长度i来调整数组b的长度,删去数组b中多余的字符串b[]="defghijklabc"

    for(i=0;b[i]!='';i++)

               { a[i]=b[i]; }                  \把数组b中调整好的字符串重新赋给数组a\

    }

    再次我们来解决字符串循环右移的问题

    方法一:调用已经有的字符串函数。

    #include<stdio.h>

    #include<string.h>

    void leftloop(char *a, int n);

    main()

    {

    char a[100];   int n;

    printf("请输入要循环的字符串: ");

    scanf("%s",a);

    printf("请输入要循环字符串的位数: ");

    scanf("%d",&n);                                       \以上代码也可以直接赋初值,我考虑的是一般情况\

    void leftloop(a,n);                                    \本例以a[]="abcdefghijk", n=3为例讲解\

    printf"输出已经循环左移的字符串:%s ",a);

    }

    void leftloop(char*a,int n)

    {char b[100];      \数组b要做的够大即可\

    int m;

    m=strlen(a)-n;              \求出除去要循环右移之后剩下的字符的个数\

    strcpy(b,a+m);            \ a+ma代表a[0]的地址再加上m,表示要把a[m]之后的字符串(即那些需要循环左移的字符,共有n个)复制到数组b中。这时b[]="ijk" \

    strcpy(b+n,a);                  \ b+n, 因为上面已经把需要循环的n个字符赋给了b,所以b[n]之前的不能在赋值了,只能把a的全部字符串赋给b[n]之后的空间了。这时b[]="ijkabcdefghijk"\

    *(b+strlen(a))='';              \这里是问题的关键,要根据a字符串的长度来舍弃b数组中多余的字符串,并给数组b加结束符。这时b[]="ijkabcdefgh";\

    strcpy(a,b);                                \把数组b中调整好的字符串重新赋给数组a\

    }

    方法二:就是用简单的c语句;#include<stdio.h>

    void leftloop(char , int )

    main()

    {

    char a[100];   int n;

    printf("请输入要循环的字符串: ");

    scanf("%s",a);

    printf("请输入要循环字符串的位数: ");

    scanf("%d",&n);                                        \以上代码也可以直接赋初值,我考虑的是一般情况\

    void leftloop(a,n);                                    \本例以a[]="abcdefghijk", n=3为例讲解\

    printf"输出已经循环左移的字符串:%s ",a);

    }

    void leftloop(char a[ ], int n)

    {

           int i=0,j=0,k;

            int m; char b[100];

    while(a[i]!='')

            { i++; }     \这里用i来计算数组a中字符串的大小;\

    k=m=i-n;          \计算出前面有多少个字符不用移动\

    while(a[k]!='')

    {

         b[j]=a[k]; j++; k++;

    \因为这时k=i-ma[k]表示需要循环移动的第一个字符,这里是把需要循环右移的字符串赋值到数组b中;b[ ]="ijk"\

    b[j]='';

    m--;k--;     \因为要用m调节下面的循环但是要从0开始所以比实际的多了一次;k--是为了要留着数组a中的结束符,不出现乱码;\

    while(m>=0)

    {

        a[k]=a[m]; m--; k--;

    }                  原来a[k]=“abcdefghijk",a[m]="abcdefgh",赋值之后a[k]="abcabcdefgh";\

    for(i=0;b[i]!='';i++)

               { a[i]=b[i]; }       \把数组b中调整好的字符串重新赋给数组ab[i]="ijk";a[i]="abcabcdefgh"。赋值之后a[i]="j\

    }

    1、字符串循环右移---交换的方法

    解法:根据题意,编写的函数能把字符串循环右移n位。例如字符串“abcdefghi”,如果n=2,移位后是“hiabcdefg”。

    (1)先翻转前段“gfedcba hi”,

    (2)再翻转后段“gfedcba ih”

    (3)最后翻转整个“hi abcdefg”,得到想要的结果。

    下面是c语言的指针操作代码

     1 #include <stdio.h>  
     2 #include <stdlib.h>  
     3 #include <string.h>  
     4   
     5 void reserve(char *p, char *q)  
     6 {  
     7     while(p < q)  
     8     {  
     9         *p ^= *q;  //利用异或运算得到两字符交换  
    10         *q ^= *p;  
    11         *p ^= *q;  
    12         p++;  
    13         q--;  
    14     }  
    15 }  
    16 void loopMove(char *str, int steps)  
    17 {  
    18     char *p = str;  
    19     int len = strlen(str);  
    20     char *q = p + len - 1 - steps;  
    21     //printf("%s
    ", q);  
    22   
    23     reserve(p, q);   //先翻转前一段  
    24     p = q + 1;  
    25     q = str + len - 1;  
    26     reserve(p, q);   //翻转后一段  
    27     p = str;  
    28     reserve(p, q);   //翻转整个字符串  
    29     //printf("%s
    ", str);  
    30 }  
    31   
    32 int main()  
    33 {  
    34     char string[] = "123456789";  
    35     int steps = 0;  
    36   
    37     printf("string: %s
    ", string);  
    38     printf("input step: ");  
    39     scanf("%d", &steps);  
    40     loopMove(string, steps);  
    41     printf("after loopMove %d: %s
    ", steps, string);  
    42   
    43     return 0;  
    44 } 

     

  • 相关阅读:
    Linux防火墙命令
    Linux学习笔记:(三)软件包管理(更新中)
    Linux赋予root权限
    Linux学习笔记:(二)用户和组群账户管理
    Linux目录结构
    Sublime Text3中Package Control Install Package打不开问题
    Linux学习笔记:(一)常用命令大全
    SpringBoot项目中整合Mybatis框架
    IDEA快速创建springboot项目
    java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream 报错解决
  • 原文地址:https://www.cnblogs.com/fickleness/p/3149009.html
Copyright © 2011-2022 走看看