编写一个函数,可以左旋字符串中k个字符

题目:

       实现一个函数,可以左旋字符串中的k个字符。

例如:

abcdef左旋一个字符得到bcdefa

abcdef左旋两个字符得到cdefab


题目分析:

           对于这个问题,可以用很多种方法求解,这里介绍两种方法:

算法一:

          左旋字符串的k个字符,我们可以先将剩下的n-k个字符移动最前面,然后将左旋的k个字符移动到字符串的最后面的位置,这就完成了字符串左旋k个字符的功能。其中,对于n-k个字符的移动,可以利用while循环,将后面的字符逐一进行拷贝。下面是具体的程序:


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
 
void left_move(char *str, int num)
{
    int i = 0;
    for (i = 0; i < num; i++)
    {
        char tmp = *str;
        int j = 0;
        while (*(str + 1 + j))     //将后面的字符移动到前面位置
        {
            *(str + j) = *(str + 1 + j);
            j++;
         }
        *(str + j) = tmp;    //将前面左旋的字符移动到后面
    }
}
 
int main()
{
    char arr[10] = "abcdef";
    left_move(arr, 2);
    printf("输出左旋之后的字符串:\n");
    printf("%s\n" , arr);
    system("pause");
    return 0;
}


算法二:

        对于左旋字符串k个字符,可以将左旋的k个字符进行逆置,然后将剩下的n-k个字符进行逆置,最后,将整个字符串进行逆置,即就是:abcdef左旋两个字符,对ab进行逆置得到ba,对cdef进行逆置得到fedc,最后将整个字符串bafedc进行逆置得到cdefab,这就完成了题目要求。下面为具体的程序:


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char exchange( char *left, char *right )
{
     char *p = left;
     char tmp = 0;
     while(left != NULL && right != NULL && left < right)
     {
         tmp = *left;
         *left = *right;
         *right = tmp;
         left++;
         right--;
     }
}
 
char *left(char *arr, int num)     
{  
    int len = strlen(arr);  
    exchange(arr, arr + (num - 1));    
    exchange(arr + num, arr + (len - 1));   
    exchange(arr, arr + (len - 1));    
    return arr;  
} 
 
int main()
{
    char arr[] = "abcdef";
    puts(left(arr, 2));
    system("pause");
    return 0;
}

注:对于判断两个字符串中,其中一个字符串为另一个字符串左旋或右旋后的字符串的问题,见下篇博客:

     判断一个字符串是否为另外一个字符串旋转之后的字符串j_0057.gif


本文出自 “无心的执着” 博客,转载请与作者联系!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值