C语言练习14

本文介绍了如何通过编程实现字符串的左旋操作,并提供了一个函数来判断一个字符串是否为另一个字符串旋转后的结果。通过实例演示了如何使用这些函数,包括输入字符串、进行旋转操作以及比较两个字符串是否为旋转关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

思路:获取要旋转的数字k,先将整个字符串倒置,然后翻转后k个字符的顺序,再翻转剩下的字符.这样就可以得到字符串左旋k个字符的结果,并且保证顺序不出错

代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void Rotate(char* start, char* end){
    int count = 0;
    while (start < end){
        *start = *start^*end;
        *end = *start^*end;
        *start = *start^*end;
        ++start;
        --end;
        count++;
    }
}

int main(){
    char arr[] = "ABCD";
    int len=strlen(arr)-1;
    int k = 0;
    printf("请输入k的值:");
    scanf("%d", &k);
    Rotate(arr, arr+len);//翻转整个字符串
    Rotate(arr, arr + len-k);//翻转不需要左旋的字符
    Rotate(arr+len-k+1, arr + len);//调整左旋的字符顺序
    printf("左旋后的字符串为:");
    printf("%s\n", arr);
    return 0;
}

2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

分别判断两个字符串长度,若两个字符串长度不相等直接返回0.若长度相等,可以利用上一题反向思路,将其中一个字符串左旋一个字符,每左旋一次,判断一次.判断次数最多为"字符串长度"次,若判断次数用完两个字符串仍不相等则返回0,若其中遇到相等的情况,返回1.

代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>

#define MAX 100

void Rotate(char* start, char* end){
    while (start < end){
        *start = *start ^ *end;
        *end = *start ^ *end;
        *start = *start ^ *end;
        ++start;
        --end;
    }
}

void left_rotate(char* str,int k){
    int len=strlen(str);
    Rotate(str,str+len-1);
    //旋转所有字符
    Rotate(str,str+len-1-k);
    //翻转所有无需旋转的字符
}

int is_rotate(char* s1,char*s2) {

    if (strlen(s1)!=strlen(s2)) {
        return 0;
        //判断两个字符串的长度,若不相等则直接返回0;
    }
    if (0==strcmp(s1, s2)) {
        return 1;
    }
    int k = strlen(s1);

    while (k>0) {
        left_rotate(s1, 1);
        if (0==strcmp(s1, s2)) {
            return 1;
        }
        k--;
    }
    return 0;
}
int main(){
    char s1[MAX] = { 0 };
    char s2[MAX] = { 0 };
    printf("请输入第一组字符串(5个字符):");
    scanf("%s", &s1);
    printf("请输入第二组字符串(5个字符):");
    scanf("%s", &s2);
    printf("%d\n",is_rotate(s1,s2));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值