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

C語(yǔ)言左旋字符串的三種實(shí)現(xiàn)方式

 更新時(shí)間:2024年03月21日 09:57:33   作者:李白同學(xué)  
本文章將使用三種思路實(shí)現(xiàn)字符串的左旋(循環(huán)移動(dòng),截取和拼接,逆序反轉(zhuǎn)),文中通過(guò)代碼示例和圖文介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下

題目:

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

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

方法一:

我們畫個(gè)圖分析一下:

基本邏輯:

就是我們每一次旋轉(zhuǎn)之前,我們就取出 arr 數(shù)組的首元素存放在 tmp 中,然后將 arr 數(shù)組剩余的每一個(gè)元素都往前移動(dòng)一位,最后我們?cè)侔?tmp 中的元素放回 arr 數(shù)組末尾的位置。

實(shí)現(xiàn)算法:

我們發(fā)現(xiàn),abcd 4個(gè)字符旋轉(zhuǎn) k = 4 個(gè)字符時(shí),數(shù)組就回到了本身數(shù)組 abcd 。這時(shí),我們可以這樣理解,雖然我們旋轉(zhuǎn)了4個(gè)字符,但我們實(shí)際上我們旋轉(zhuǎn)了0個(gè)字符;依次類推,旋轉(zhuǎn)5個(gè)字符,實(shí)際上旋轉(zhuǎn)了1個(gè)字符;接下去也是如此......接下來(lái),我們?cè)侔炎址L(zhǎng)度加長(zhǎng),變成abcde 5個(gè)字符,旋轉(zhuǎn) k = 5 個(gè)字符時(shí),數(shù)組就回到了本身數(shù)組 abcde,后面的分析就跟4個(gè)字符分析是一樣的。然后,我們能夠得到這樣一個(gè)表達(dá)式 num(實(shí)際次數(shù)) = k % len(數(shù)組字符個(gè)數(shù))。

代碼實(shí)現(xiàn):

#include <stdio.h>
#include <string.h>
 
void Turn_left(char arr[],int k)
{
	int len = strlen(arr);
	//求得真實(shí)的旋轉(zhuǎn)次數(shù)
	int num = k % len;
	for (int i = 0; i < num; i++)
	{
		//每次移動(dòng)一個(gè)
		char tmp = arr[0];
		int j = 0;
		for (j = 0; j < len - 1; j++)
		{
			//移動(dòng)數(shù)據(jù)
			arr[j] = arr[j + 1];
		}
		arr[j] = tmp;
	}
}
int main()
{
	char arr[] = "abcd";
	int k = 0;
	scanf("%d", &k);//輸入旋轉(zhuǎn)字符個(gè)數(shù)
	Turn_left(arr, k);
	printf("%s\n", arr);
 
	return 0;
}

運(yùn)行結(jié)果:

方法二:

我們也可以畫個(gè)圖分析一下:

這里我們要用到兩個(gè)函數(shù):

strcpy() //字符串拷貝
strcpy(str1,str2)//將str2的元素拷貝到str2中
 
 
strncat()//這也是字符串拷貝
strncat(tmp,arr,k)//把a(bǔ)rr開(kāi)始的元素 拷貝到tmp這個(gè)字符串的后面,拷貝k個(gè)

代碼實(shí)現(xiàn):

#include <stdio.h>
#include <string.h>
 
void Turn_left(char arr[], int k)
{
	int len = strlen(arr);
	int num = k % len;
	char tmp[1000] = { 0 };
	//從arr + num的位置 開(kāi)始拷貝字符串到tmp里面 
	strcpy(tmp, arr + num);
 
	//把a(bǔ)rr開(kāi)始的元素 拷貝到tmp這個(gè)字符串的后面,拷貝num個(gè)
	strncat(tmp, arr, num);
 
	//最后將tmp整個(gè)數(shù)組元素復(fù)制到arr數(shù)組中
	strcpy(arr, tmp);
}
 
int main()
{
	char arr[] = "abcd";
	int k = 0;
	scanf("%d", &k);//輸入旋轉(zhuǎn)字符個(gè)數(shù)
	Turn_left(arr, k);//2
	printf("%s\n", arr);
 
	return 0;
}

運(yùn)行結(jié)果:

方法三:

最后一種方式我們也畫圖分析一下:

代碼實(shí)現(xiàn):

#include <stdio.h>
 
void Reverse(char arr[], int i, int j)
{
	while (i < j)
	{
		char tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
		i++;
		j--;
	}
}
 
void Turn_left(char arr[], int k)
{
	int len = strlen(arr);
	int num = k % len;
	//將num位置前面的元素逆序
	Reverse(arr, 0, num - 1);
 
	//將num位置以及之后的元素逆序
	Reverse(arr, num, len - 1);
 
	//整個(gè)數(shù)組逆序
	Reverse(arr, 0, len - 1);
}
 
 
int main()
{
	char arr[] = "abcd";
	int k = 0;
	scanf("%d", &k);//輸入旋轉(zhuǎn)字符個(gè)數(shù)
	Turn_left(arr, k);//2
	printf("%s\n", arr);
 
	return 0;
}

運(yùn)行結(jié)果:

以上就是C語(yǔ)言左旋字符串的三種實(shí)現(xiàn)方式的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言左旋字符串的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++程序中啟動(dòng)線程的方法

    C++程序中啟動(dòng)線程的方法

    這篇文章主要介紹了C++程序中啟動(dòng)線程的方法,作者針對(duì)C++11版本中的一些新特性進(jìn)行了解說(shuō),需要的朋友可以參考下
    2015-07-07
  • codeblocks安裝及使用超詳細(xì)圖文教程

    codeblocks安裝及使用超詳細(xì)圖文教程

    這篇文章主要介紹了codeblocks安裝及使用教程詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • C++學(xué)習(xí)心得之掃雷游戲

    C++學(xué)習(xí)心得之掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C++學(xué)習(xí)心得之掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++類常量和類枚舉

    C++類常量和類枚舉

    這篇文章主要介紹了C++類常量和類枚舉,給類當(dāng)中定義一些常量,可以給所有類的對(duì)象使用,比如說(shuō)我們?cè)陬惍?dāng)中定義一個(gè)數(shù)組,希望可以定義一個(gè)常量,用來(lái)初始化數(shù)組的長(zhǎng)度,那么下面我i嗎就來(lái)看看過(guò)程當(dāng)如何吧
    2022-01-01
  • C語(yǔ)言實(shí)現(xiàn)猜數(shù)字

    C語(yǔ)言實(shí)現(xiàn)猜數(shù)字

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • C++中的幾種排序算法

    C++中的幾種排序算法

    這篇文章主要介紹了C++中的幾種排序算法,需要的朋友可以參考下
    2014-02-02
  • C++ Vector迭代器失效問(wèn)題的解決方法

    C++ Vector迭代器失效問(wèn)題的解決方法

    最近我學(xué)習(xí)了C++中的迭代器失效問(wèn)題,迭代器失效問(wèn)題是非常非常重要的,所以特意整理出來(lái)一篇文章供我們一起復(fù)習(xí)和學(xué)習(xí)
    2022-08-08
  • C++深入淺出講解函數(shù)重載

    C++深入淺出講解函數(shù)重載

    C++允許多個(gè)函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function?Overloading),借助重載,一個(gè)函數(shù)名可以有多種用途
    2022-05-05
  • C++設(shè)計(jì)模式之原型模式

    C++設(shè)計(jì)模式之原型模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之原型模式,本文講解了什么是原型模式、為什么要使用原型模式、代碼實(shí)例等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲設(shè)計(jì)

    C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評(píng)論