C/C++左旋字符串实现代码举例

 更新时间:2023年12月18日 11:17:03   作者:Zik----  
在C/C++语言中没有专门的字符串变量,通常用字符数组来存放字符串,下面这篇文章主要给大家介绍了关于C/C++左旋字符串实现的相关资料,需要的朋友可以参考下

题目

实现一个函数,可以左旋字符串中的k个字符。

例如:ABCD左旋一个字符得到BCDA     ABCD左旋两个字符得到CDAB。

设计循环使其可以旋1次,然后让他执行n次是一个最简单的思路:

长度为5的情况下,旋转6、11、16...次相当于1次,7、12、17...次相当于2次,以此类推。

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

改进一:

一次一次转比较麻烦,我们可以选择拼接法,一次到位:

void leftRound(char * src, int time)
{
	int len = strlen(src);
	int pos = time % len; //断开位置的下标
	char tmp[256] = { 0 }; //更准确的话可以选择malloc len + 1个字节的空间来做这个tmp
	
	strcpy(tmp, src + pos); //先将后面的全部拷过来
	strncat(tmp, src, pos); //然后将前面几个接上
	strcpy(src, tmp); //最后拷回去
}

改进二:

这个方法要用到一个数组形成的辅助空间,让人觉得有点不爽,还可以有更好的选择,例如ABCDEFG,左旋3次后变成DEFGABC,有一个特殊的操作方式:

先将要左旋的前三个家伙逆序(CBADEFG),然后将后半段也逆序(CBAGFED),最后整体逆序(DEFGABC)即可。这样只需要做数值交换即可,可以写一个函数帮我们完成局部逆序,代码如下:

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); //整体逆序
}

补充:右旋字符串

右旋字符串可以通过左旋字符串‘string.size()-k’步来实现。比如,对于字符串abcdefg和右旋2步,我们可以先计算需要左旋的步数为string.size()-2,然后再调用左旋函数即可。

以下为右旋字符串的C++实现代码:

#include <iostream>
#include <string>

using namespace std;

// 翻转字符串中[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;   // 需要左旋的步数
    // 翻转前left个字符和剩余字符
    reverse(str, 0, left-1);
    reverse(str, left, len-1);
    // 整个字符串翻转
    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;
}

在上述代码中,我们定义了与左旋函数相同的翻转函数,并实现了字符串的右旋函数rightRotateString。在函数中,我们先计算需要左旋的步数为string.size()-k,然后调用左旋函数即可。具体来说,我们分别翻转前left个字符和剩余字符,然后再翻转整个字符串。最后,我们将结果返回。在主函数中,我们使用字符串abcdefg,并右旋2步,输出结果为fgabcde

总结 

到此这篇关于C/C++左旋字符串实现的文章就介绍到这了,更多相关C/C++左旋字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文带你深入了解Qt中的顺序容器类与关联容器类

    一文带你深入了解Qt中的顺序容器类与关联容器类

    Qt中也有很多容器类,他们在存取速度、内存开销等方面进行了优化,使用起来更轻量级、更便捷,下面就跟随小编一起来学习一下它们的具体使用吧
    2024-04-04
  • C语言实现英文单词助手

    C语言实现英文单词助手

    这篇文章主要为大家详细介绍了C语言实现单词小助手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • C语言中的一维数组与二维数组的实现

    C语言中的一维数组与二维数组的实现

    数组可以帮我们巧妙解决生活中的问题,使我们的代码简洁,本文主要介绍了C语言中的一维数组与二维数组,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • DEV C++源码编译后控制台输出中文乱码问题解决

    DEV C++源码编译后控制台输出中文乱码问题解决

    本文主要介绍了DEV C++源码编译后控制台输出中文乱码问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 详解C语言结构体中的函数指针

    详解C语言结构体中的函数指针

    这篇文章主要介绍了详解C语言结构体中的函数指针,文中对函数指针的基本概念也有讲解,需要的朋友可以参考下
    2016-04-04
  • C++11/14 线程中使用Lambda函数的方法

    C++11/14 线程中使用Lambda函数的方法

    这篇文章主要介绍了C++11/14 线程中使用Lambda函数的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • C语言之结构体定义 typedef struct 用法详解和用法小结

    C语言之结构体定义 typedef struct 用法详解和用法小结

    这篇文章主要介绍了C语言的结构体定义typedef struct用法详解和用法小结,typedef是类型定义,typedef struct 是为了使用这个结构体方便,感兴趣的同学可以参考阅读
    2023-03-03
  • C语言数据结构之单向链表详解分析

    C语言数据结构之单向链表详解分析

    链表可以说是一种最为基础的数据结构了,而单向链表更是基础中的基础。链表是由一组元素以特定的顺序组合或链接在一起的,不同元素之间在逻辑上相邻,但是在物理上并不一定相邻。在维护一组数据集合时,就可以使用链表,这一点和数组很相似
    2021-11-11
  • C语言利用模板实现简单的栈类

    C语言利用模板实现简单的栈类

    这篇文章主要为大家详细介绍了C语言利用模板实现简单的栈类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • C++记录程序运行时间的四种方法

    C++记录程序运行时间的四种方法

    在学习过程中很重要的一个必会的小技巧:计算某一段代码的执行时间,可以用来分析代码的效率和算法的时间复杂度等等(个人主要是在总结各种排序算法时遇到的这个方法),本文给大家介绍了C++记录程序运行时间的四种方法,需要的朋友可以参考下
    2025-03-03

最新评论