当前位置: 首页 > news >正文

字符串左旋 与 字符串旋转结果

字符串左旋

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

方法1

三步翻转法
要求:abcdef 左旋两个

  • 整体逆序:fedcba
  • 左边逆序:cdef ba
  • 右边逆序:cdef ab
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left, char* right)
{assert(left);assert(right);while (left < right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}
}
void left_move(char* arr, int k)
{assert(arr);int len = strlen(arr);k %= len;reverse(arr, arr + len - 1);//逆序整体reverse(arr, arr + len - k - 1);//逆序左边reverse(arr + len - k, arr + len - 1);//逆序右边
}
int main()
{char arr[] = "abcdef";left_move(arr, 2);printf("%s\n", arr);return 0;
}

方法2

  • 将第一个元素放到临时变量
  • 后面元素前移一位
  • 然后把临时变量的值放到最后
  • 循环
#include<stdio.h>
#include<string.h>
#include<assert.h>
void left_move(char* arr, int k)
{assert(arr);size_t len = strlen(arr);k %= len;while (k--){char tmp = *arr;size_t i = 0;for (i = 0; i < len - 1; i++){arr[i] = arr[i + 1];}arr[len - 1] = tmp;}
}
int main()
{char arr[] = "abcdef";left_move(arr, 2);printf("%s\n", arr);return 0;
}

字符串旋转结果

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

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

方法1(穷举)

#include<stdio.h>
#include<string.h>
#include<assert.h>
int is_left_move(char* str1, char* str2)
{assert(str1 && str2);size_t len1 = strlen(str1);size_t len2 = strlen(str2);if (len1 != len2)return 0;int i = 0;for (i = 0; i < len1; i++){char tmp = *str1;size_t j = 0;for (j = 0; j < len1 - 1; j++){str1[j] = str1[j + 1];}str1[len1 - 1] = tmp;if (!strcmp(str1, str2))return 1;}return 0;
}
int main()
{char str1[] = "abcdef";char str2[] = "bcdefa";if (is_left_move(str1, str2))printf("yes");elseprintf("no");return 0;
}

方法2

在原字符串后面追加一个相同的字符串
旋转字符串是这个大的字符串的子字符串

#include<stdio.h>
#include<string.h>
#include<assert.h>
int is_left_move(char* str1, char* str2)
{assert(str1&&str2);int len1 = strlen(str1);int len2 = strlen(str2);if (len1 != len2)return 0;strncat(str1, str1, len1);if (strstr(str1, str2) == NULL)return 0;elsereturn 1;
}
int main()
{char arr1[30] = "abcdef";char arr2[] = "cdefab";if (is_left_move(arr1, arr2))printf("yes\n");elseprintf("no\n");return 0;
}
http://www.lryc.cn/news/191517.html

相关文章:

  • 真人现在猫鼠躲猫猫游戏搭建流程:专业思考与深度思考
  • 计算机导论实验——Linux基础入门
  • 服务运营 |摘要:学术+业界-近期前沿运筹医疗合作精选
  • 基于Dockerfile创建镜像
  • 架构实战关键知识点
  • M1Mac开启x86_64命令行archlinux虚拟机的最佳实践(qemu)
  • 深度神经网络压缩与加速技术
  • 系统架构设计:11 论湖仓一体架构及其应用
  • Linux系统编程_文件编程第1天:打开、写入、读取、关闭文件等编程
  • scapy构造ND报文
  • c++设计模式之单例设计模式
  • App自动化测试环境搭建
  • win10搭建gtest测试环境+vs2019
  • 【代码随想录】算法训练营 第二天 第一章 数组 Part 2
  • 在深度学习中,累计不同批次的损失估计总体损失
  • 论文导读|八月下旬Operations Research文章精选:定价问题专题
  • (三)Apache log4net™ 手册 -演示
  • VScode远程root权限调试
  • 【ARM CoreLink 系列 7 -- TZC-400控制器简介】
  • 【C++】-c++11的知识点(中)--lambda表达式,可变模板参数以及包装类(bind绑定)
  • 浅析倾斜摄影三维模型(3D)几何坐标精度偏差的几个因素
  • 【广州华锐互动】智轨列车AR互动教学系统
  • 驾驶数字未来:汽车业界数字孪生技术的崭新前景
  • JVM 性能调优参数
  • 11在SpringMVC中响应到浏览器的数据格式,@ResponseBody注解和@RestController复合注解的功能详解
  • go 流程控制之switch 语句介绍
  • sql 时间有偏差的解决方法
  • Apache Lucene 7.0 - 索引文件格式
  • GEE:使用中文做变量和函数名写GEE代码
  • 针对量化交易SDK的XTP的初步摸索