網站首頁 編程語言 正文
題目內容:
實現一個函數,可以左旋字符串中的k個字符。
例如:
ABCD左旋一個字符得到BCDA。
ABCD左旋兩個字符得到CDBA。
方法一:
所謂左旋,不就是將字符串第一個元素放到末尾嘛,所以我們可以將字符串第一個元素取出,將字符串其他元素全部向前挪動一位,這時字符串的最后一位剛好空出,我們再將首元素放在最后一位,完美完成了一次字符串左旋。
?代碼實現如下
#include<stdio.h>
#include<string.h>
void string_revolve1(char* str, int k)
{
//左旋一個字符
int n = strlen(str);
int i = 0;
for (i = 0; i < k; i++)
{
char tmp = *str;
int j = 0;
//每個字符向前移動一位
for (j = 0; j < n; j++)
{
*(str + j) = *(str + j + 1);
}
//第一個字符旋轉到最后一位
*(str + n - 1) = tmp;
}
}
int main()
{
char a[111];
gets(a);
int k = 0;
scanf("%d", &k);
string_revolve1(a, k);
printf("%s",a);
return 0;
}
方法2:三步翻轉法
首先我們看一個字符串:? ?ABCDEF 假如我們要左旋k=2個字符 ,我們便有如下做法:
1. 先逆序字符k之前的字符,也就是逆序前兩個字符
ABCDEF --- BACDEF
2.再逆序字符k之后的字符,也就是逆序后四個字符
BACDEF---BAEFDC
3.再逆序此字符串整體,便可以得到結果
BAEFDC---CDFEBA
是不是十分神奇?接下來我們根據此思路,寫出代碼
#include<stdio.h>
#include<string.h>
void reverse_ordef(char* left,char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void string_revolve2(char* str, int k)
{
// a b c d e f
int n = strlen(str);
//將k之前的字符逆序
reverse_ordef(str, str + k - 1);
//將k之后的字符逆序
reverse_ordef(str+k,str+n-1);
//將字符串整體逆序
reverse_ordef(str, str+n-1);
}
int main()
{
int k = 0;
char str[111];
gets(str);
scanf("%d", &k);
string_revolve2(str, k);
printf("%s", str);
return 0;
}
補充:C語言--左旋字符串中的k個字符
看這么一個問題:
1.實現一個函數,可以左旋字符串中的k個字符。
- ABCD左旋一個字符得到BCDA
- ABCD左旋兩個字符得到CDAB
拿到問題后,我們首先應該理解題意。什么是左旋?根據例題可以看出是把k個字符經過左旋放到后面,下面給出兩種方法來求解:方法一:暴力求解
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
void left_move(char* str, int k)
{
?? ?int j = 0;
?? ?for(j=0; j<k; j++)
?? ?{
?? ??? ?//旋轉1個字符
?? ??? ?char tmp = *str;
?? ??? ?int len = strlen(str);
?? ??? ?int i = 0;
?? ??? ?for(i=0; i<len-1; i++)
?? ??? ?{
?? ??? ??? ?*(str+i) = *(str+i+1);
?? ??? ?}
?? ??? ?*(str+len-1) = tmp;
?? ?}
}
int main()
{
?? ?char arr[] = "abcdef";//cdefab
?? ?left_move(arr, 8);
?? ?printf("%s\n", arr);
?? ?system("pause");
?? ?return 0;
}
這種方法的優點是容易想到,實現起來比較容易。保利求解思想就是你給一個k我就給你左旋k個字符串,但也存在一些缺點,比如可能存在某些問題。下面我們來看另一個較優方法。
方法二
我們來先看代碼:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
void reverse_str(char *left, char *right)
{
?? ?assert(left != NULL);
?? ?assert(right != NULL);
?? ?while(left<right)
?? ?{
?? ??? ?char tmp = *left;
?? ??? ?*left = *right;
?? ??? ?*right = tmp;
?? ??? ?left++;
?? ??? ?right--;
?? ?}
}
void left_move(char* str, int k)
{
?? ?int len = 0;
?? ?assert(str != NULL);
?? ?len = strlen(str);
?? ?reverse_str(str, str+k-1);
?? ?reverse_str(str+k, str+len-1);
?? ?reverse_str(str, str+len-1);
}
int main()
{
?? ?char arr[] = "abcdef";//cdefab
?? ?left_move(arr, 8);
?? ?printf("%s\n", arr);
?? ?system("pause");
?? ?return 0;
}
這個方法比較靈活,他根據abcdef先在k個字符左右先各自左旋得到字符串bafedc,再將整個字符串整體左旋得到所求字符串cdefab;這個方法比較靈性,它合理的將問題拆分,化成一個個來求解,所以這里比較推薦第二個方法。希望可以給大家帶來幫助,一起學習進步。
總結
原文鏈接:https://blog.csdn.net/qq_49923458/article/details/128824095
相關推薦
- 2024-02-17 通過AOP切面實現公共字段的自動填充
- 2022-07-08 python使用IPython調試debug程序_python
- 2023-07-16 uniapp 小程序訂閱消息報錯( wx.requestSubscribeMessage is no
- 2023-04-16 C#使用IronPython調用Python的實現_C#教程
- 2023-11-14 Docker 拉取結果為“等待連接時請求取消(等待標頭時超出客戶端超時);Error respons
- 2022-12-29 python查看包版本、更新單個包、卸載單個包的操作方法_python
- 2022-04-11 一篇文章帶你入門python之推導式_python
- 2022-06-08 Springboot+Seata整合以及事務模式分析
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支