最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)。比如,對(duì)于字符串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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文帶你深入了解Qt中的順序容器類與關(guān)聯(lián)容器類

    一文帶你深入了解Qt中的順序容器類與關(guān)聯(lián)容器類

    Qt中也有很多容器類,他們在存取速度、內(nèi)存開銷等方面進(jìn)行了優(yōu)化,使用起來更輕量級(jí)、更便捷,下面就跟隨小編一起來學(xué)習(xí)一下它們的具體使用吧
    2024-04-04
  • C語言實(shí)現(xiàn)英文單詞助手

    C語言實(shí)現(xiàn)英文單詞助手

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)單詞小助手,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C語言中的一維數(shù)組與二維數(shù)組的實(shí)現(xiàn)

    C語言中的一維數(shù)組與二維數(shù)組的實(shí)現(xiàn)

    數(shù)組可以幫我們巧妙解決生活中的問題,使我們的代碼簡潔,本文主要介紹了C語言中的一維數(shù)組與二維數(shù)組,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • DEV?C++源碼編譯后控制臺(tái)輸出中文亂碼問題解決

    DEV?C++源碼編譯后控制臺(tái)輸出中文亂碼問題解決

    本文主要介紹了DEV?C++源碼編譯后控制臺(tái)輸出中文亂碼問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 詳解C語言結(jié)構(gòu)體中的函數(shù)指針

    詳解C語言結(jié)構(gòu)體中的函數(shù)指針

    這篇文章主要介紹了詳解C語言結(jié)構(gòu)體中的函數(shù)指針,文中對(duì)函數(shù)指針的基本概念也有講解,需要的朋友可以參考下
    2016-04-04
  • C++11/14 線程中使用Lambda函數(shù)的方法

    C++11/14 線程中使用Lambda函數(shù)的方法

    這篇文章主要介紹了C++11/14 線程中使用Lambda函數(shù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • C語言之結(jié)構(gòu)體定義 typedef struct 用法詳解和用法小結(jié)

    C語言之結(jié)構(gòu)體定義 typedef struct 用法詳解和用法小結(jié)

    這篇文章主要介紹了C語言的結(jié)構(gòu)體定義typedef struct用法詳解和用法小結(jié),typedef是類型定義,typedef struct 是為了使用這個(gè)結(jié)構(gòu)體方便,感興趣的同學(xué)可以參考閱讀
    2023-03-03
  • C語言數(shù)據(jù)結(jié)構(gòu)之單向鏈表詳解分析

    C語言數(shù)據(jù)結(jié)構(gòu)之單向鏈表詳解分析

    鏈表可以說是一種最為基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)了,而單向鏈表更是基礎(chǔ)中的基礎(chǔ)。鏈表是由一組元素以特定的順序組合或鏈接在一起的,不同元素之間在邏輯上相鄰,但是在物理上并不一定相鄰。在維護(hù)一組數(shù)據(jù)集合時(shí),就可以使用鏈表,這一點(diǎn)和數(shù)組很相似
    2021-11-11
  • C語言利用模板實(shí)現(xiàn)簡單的棧類

    C語言利用模板實(shí)現(xiàn)簡單的棧類

    這篇文章主要為大家詳細(xì)介紹了C語言利用模板實(shí)現(xiàn)簡單的棧類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++記錄程序運(yùn)行時(shí)間的四種方法

    C++記錄程序運(yùn)行時(shí)間的四種方法

    在學(xué)習(xí)過程中很重要的一個(gè)必會(huì)的小技巧:計(jì)算某一段代碼的執(zhí)行時(shí)間,可以用來分析代碼的效率和算法的時(shí)間復(fù)雜度等等(個(gè)人主要是在總結(jié)各種排序算法時(shí)遇到的這個(gè)方法),本文給大家介紹了C++記錄程序運(yùn)行時(shí)間的四種方法,需要的朋友可以參考下
    2025-03-03

最新評(píng)論

利辛县| 彰化县| 玉溪市| 洪泽县| 安阳县| 安阳市| 利辛县| 大连市| 商南县| 新兴县| 师宗县| 宾川县| 富源县| 武夷山市| 福泉市| 漳平市| 蛟河市| 台南县| 十堰市| 黎城县| 钟山县| 得荣县| 吉林省| 布尔津县| 凤山县| 多伦县| 阳山县| 大冶市| 巍山| 阳城县| 东明县| 浦城县| 拉萨市| 翁牛特旗| 凌云县| 南皮县| 虞城县| 宁南县| 西青区| 泰来县| 剑阁县|