日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

左旋字符

發布時間:2023/11/27 生活经验 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 左旋字符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述:

?實現一個函數,可以左旋字符串中的k個字符。
AABCD左旋一個字符得到ABCDA
AABCD左旋兩個字符得到BCDAA

該問題有三種方法,現做一一分析

法一:通過移動字符實現左旋

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>char *leftstring(char *str, int num,int len)
{char arr[10];char *p = str,*q = str;int i = 0;for (i = 0; i < num; i++)         //比如我們需要左旋兩個字符串,那么先把原字符串的最前面的兩個字符存起來{arr[i] = *p++;}p = str;p += num;                         //用p指向需要前移的第一個字符for (i = num; i < len-1; i++)   //從第一個字符開始依次把后面的字符前移,做前移操作,i控制次數{*str++ = *p++;}for (i = 0; i < num; i++)       //把剛剛取出來的字符,存到原字符串前移后的后面{*str++ = arr[i];}return q;
}int main()
{char arr[] = "AABCD";int len = sizeof(arr) / sizeof(arr[0]);leftstring(arr, 2, len);printf("%s\n",arr);system("pause");return 0;
}

法二:通過置換函數進行左旋操作

比如abcd1234,如果我們想左旋四個,我們可以先把前面四個逆序得到dcba,接著把后面逆序得到4321,這樣兩次逆序后的結果是dcba4321,然后再整體逆序,得到了1234abcd,同樣的方法大家可以試一下左旋兩個是不是同樣的效果

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<windows.h>//通過置換函數進行左旋操作void swap(char *p, char *q)     //置換兩個字符
{assert(p);             //每次傳入一個地址時進行斷言,防止傳址出錯assert(q);*p ^= *q;*q ^= *p;*p ^= *q;
}char *ReverseOrder(char *left, char *right)   //置換一組字符
{assert(left);assert(right);char *arr = left;while (arr < right){swap(arr, right);arr++, right--;}return left;
}char *leftstring(char *str, int num,int len)   //通過前后字符替換實現左旋
{assert(str);char *string = str;                       num = num % len;                          //加上一個取余的操作,目的是如果左旋的次數大于字符串的長度,比如該題如果是9,實際的結果只左旋了一次ReverseOrder(string, string + num - 1);          //先置換前一部分,再置換后一部分,然后整體置換ReverseOrder(string + num, string + len - 1);ReverseOrder(string, string + len - 1);return str;
}int main()
{char arr[] = "abcd1234";int len = (sizeof(arr) / sizeof(arr[0])) - 1;leftstring(arr, 2, len);printf("%s\n",arr);system("pause");return 0;
}

法三:通過在拼接進行左旋,把和原字符串同樣內容的字符串拼接在原字符串的后面

分析如下,如果我們的原字符串是abcd1234,現在我左旋2,想要得到的結果是cd1234ab,我使用本方法是在原字符串的后面拼接一整個,得到abcd1234abcd1234,然后從第三個字符開始把內容依次復制到原字符串中去,循環的次數是8.

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<windows.h>
#include<string.h>//通過在拼接進行左旋,把和原字符串同樣內容的字符串拼接在原字符串的后面char *leftstring(char *str, int num, int len)
{assert(str);int i = 0;char *string = str;char *arr = (char *)malloc(2*len + 1);    //開辟空間使2*len+1,其中+1位為了給結尾處留有一個'\0'的空間num = num % len;strcpy(arr,string);strcat(arr,string);for (i = 0; i < len; i++){*string++ = arr[i+num];}return str;
}int main()
{char arr[] = "abcd1234";int len = (sizeof(arr) / sizeof(arr[0])) - 1;leftstring(arr, 2, len);printf("%s\n",arr);system("pause");return 0;
}



總結

以上是生活随笔為你收集整理的左旋字符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。