欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++左旋字符串實(shí)現(xiàn)代碼舉例

 更新時(shí)間:2023年12月18日 11:17:03   作者:Zik----  
在C/C++語言中沒有專門的字符串變量,通常用字符數(shù)組來存放字符串,下面這篇文章主要給大家介紹了關(guān)于C/C++左旋字符串實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下

題目

實(shí)現(xiàn)一個(gè)函數(shù),可以左旋字符串中的k個(gè)字符。

例如:ABCD左旋一個(gè)字符得到BCDA     ABCD左旋兩個(gè)字符得到CDAB。

設(shè)計(jì)循環(huán)使其可以旋1次,然后讓他執(zhí)行n次是一個(gè)最簡單的思路:

長度為5的情況下,旋轉(zhuǎn)6、11、16...次相當(dāng)于1次,7、12、17...次相當(dāng)于2次,以此類推。

void leftRound(char * src, int time)
{
	int i, j, tmp;
  int len = strlen(src);
  time %= len; 
	for (i = 0; i < time; i++) //執(zhí)行k次的單次平移
	{
		tmp = src[0];
		for(j = 0; j < len - 1; j++) //單次平移
		{
			src[j] = src[j + 1];
		}
		src[j] = tmp;
	}
}

改進(jìn)一:

一次一次轉(zhuǎn)比較麻煩,我們可以選擇拼接法,一次到位:

void leftRound(char * src, int time)
{
	int len = strlen(src);
	int pos = time % len; //斷開位置的下標(biāo)
	char tmp[256] = { 0 }; //更準(zhǔn)確的話可以選擇malloc len + 1個(gè)字節(jié)的空間來做這個(gè)tmp
	
	strcpy(tmp, src + pos); //先將后面的全部拷過來
	strncat(tmp, src, pos); //然后將前面幾個(gè)接上
	strcpy(src, tmp); //最后拷回去
}

改進(jìn)二:

這個(gè)方法要用到一個(gè)數(shù)組形成的輔助空間,讓人覺得有點(diǎn)不爽,還可以有更好的選擇,例如ABCDEFG,左旋3次后變成DEFGABC,有一個(gè)特殊的操作方式:

先將要左旋的前三個(gè)家伙逆序(CBADEFG),然后將后半段也逆序(CBAGFED),最后整體逆序(DEFGABC)即可。這樣只需要做數(shù)值交換即可,可以寫一個(gè)函數(shù)幫我們完成局部逆序,代碼如下:

void reverse_part(char *str, int start, int end) //將字符串從start到end這一段逆序
{
	int i, j;
	char tmp;

	for (i = start, j = end; i < j; i++, j--)
	{
		tmp = str[i];
		str[i] = str[j];
		str[j] = tmp;
	}
}

void leftRound(char * src, int time)
{
	int len = strlen(src);
	int pos = time % len;
	reverse_part(src, 0, pos - 1); //逆序前段
	reverse_part(src, pos, len - 1); //逆序后段
	reverse_part(src, 0, len - 1); //整體逆序
}

補(bǔ)充:右旋字符串

右旋字符串可以通過左旋字符串‘string.size()-k’步來實(shí)現(xiàn)。比如,對于字符串abcdefg和右旋2步,我們可以先計(jì)算需要左旋的步數(shù)為string.size()-2,然后再調(diào)用左旋函數(shù)即可。

以下為右旋字符串的C++實(shí)現(xiàn)代碼:

#include <iostream>
#include <string>

using namespace std;

// 翻轉(zhuǎn)字符串中[start, end]部分
void reverse(string& str, int start, int end) {
    while (start < end) {
        swap(str[start], str[end]);
        start++;
        end--;
    }    
}

// 字符串右旋k步
string rightRotateString(string str, int k) {
    int len = str.size();
    int left = len-k%len;   // 需要左旋的步數(shù)
    // 翻轉(zhuǎn)前l(fā)eft個(gè)字符和剩余字符
    reverse(str, 0, left-1);
    reverse(str, left, len-1);
    // 整個(gè)字符串翻轉(zhuǎn)
    reverse(str, 0, len-1);
    return str;
}

int main() {
    string str = "abcdefg";
    int k = 2;
    string res = rightRotateString(str, k);
    cout << "右旋 " << k << " 步后:" << res << endl;
    return 0;
}

在上述代碼中,我們定義了與左旋函數(shù)相同的翻轉(zhuǎn)函數(shù),并實(shí)現(xiàn)了字符串的右旋函數(shù)rightRotateString。在函數(shù)中,我們先計(jì)算需要左旋的步數(shù)為string.size()-k,然后調(diào)用左旋函數(shù)即可。具體來說,我們分別翻轉(zhuǎn)前l(fā)eft個(gè)字符和剩余字符,然后再翻轉(zhuǎn)整個(gè)字符串。最后,我們將結(jié)果返回。在主函數(shù)中,我們使用字符串abcdefg,并右旋2步,輸出結(jié)果為fgabcde

總結(jié) 

到此這篇關(guān)于C/C++左旋字符串實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C/C++左旋字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ string與int的相互轉(zhuǎn)換(使用C++11)

    C++ string與int的相互轉(zhuǎn)換(使用C++11)

    本文主要介紹了C++ string與int的相互轉(zhuǎn)換(使用C++11),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Qt中QList與QLinkedList類的常用方法總結(jié)

    Qt中QList與QLinkedList類的常用方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Qt中QList與QLinkedList類的常用方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下
    2022-12-12
  • C++?二進(jìn)制文件讀寫方式及示例詳解

    C++?二進(jìn)制文件讀寫方式及示例詳解

    這篇文章主要為大家介紹了C++?二進(jìn)制文件讀寫實(shí)現(xiàn)方式及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • VC實(shí)現(xiàn)獲取當(dāng)前正在運(yùn)行的進(jìn)程

    VC實(shí)現(xiàn)獲取當(dāng)前正在運(yùn)行的進(jìn)程

    這篇文章主要介紹了VC實(shí)現(xiàn)獲取當(dāng)前正在運(yùn)行的進(jìn)程,涉及VC針對系統(tǒng)進(jìn)程的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • C++構(gòu)造函數(shù)初始化列表的實(shí)現(xiàn)詳解

    C++構(gòu)造函數(shù)初始化列表的實(shí)現(xiàn)詳解

    構(gòu)造函數(shù)主要作用在于創(chuàng)建對象時(shí)為對象的成員屬性賦值,構(gòu)造函數(shù)由編譯器自動(dòng)調(diào)用,無須手動(dòng)調(diào)用;析構(gòu)函數(shù)主要作用在于對象銷毀前系統(tǒng)自動(dòng)調(diào)用,執(zhí)行一 些清理工作
    2022-09-09
  • 詳解windows下C/C++的內(nèi)存泄露檢測

    詳解windows下C/C++的內(nèi)存泄露檢測

    C/C++由于其沒有垃圾回收機(jī)制,所以內(nèi)存的釋放一直以來都依靠于程序員的手工釋放,因此極其容易出現(xiàn)內(nèi)存泄露的問題,而在比較大的程序之中,查找內(nèi)存泄露是一件比較困難的事情,所以我們需要一些簡便的方法來檢測內(nèi)存泄露,避免內(nèi)存泄露導(dǎo)致設(shè)備崩潰
    2021-06-06
  • C++?AVL樹插入新節(jié)點(diǎn)后的四種調(diào)整情況梳理介紹

    C++?AVL樹插入新節(jié)點(diǎn)后的四種調(diào)整情況梳理介紹

    AVL樹是高度平衡的而二叉樹,它的特點(diǎn)是AVL樹中任何節(jié)點(diǎn)的兩個(gè)子樹的高度最大差別為1,本文主要給大家介紹了C++如何實(shí)現(xiàn)AVL樹,需要的朋友可以參考下
    2022-08-08
  • C++使用printf語句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼

    C++使用printf語句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼

    在C語言中,printf 函數(shù)可以直接實(shí)現(xiàn)部分進(jìn)制轉(zhuǎn)換功能,通過格式說明符(format specifier)快速輸出不同進(jìn)制的數(shù)值,下面給大家分享C++使用printf語句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼,感興趣的朋友一起看看吧
    2025-04-04
  • C++合并二叉樹的思路與示例代碼

    C++合并二叉樹的思路與示例代碼

    二叉樹大家應(yīng)該都不陌生,但是合并二叉樹呢?這篇文章主要給大家介紹了關(guān)于C++合并二叉樹的相關(guān)資料,文中給出了兩種解決的方法,大家可以根據(jù)需要選擇對應(yīng)的方法,需要的朋友可以參考下
    2021-08-08
  • C指針原理教程之C快速入門

    C指針原理教程之C快速入門

    C語言作為大學(xué)編程或者計(jì)算機(jī)專業(yè)的一門必修課,把很多初學(xué)編程的小伙伴都難住了,感覺無從下手,今天呢,我們來簡單介紹下,如何快速入門C語言
    2019-02-02

最新評論