首页 > 左旋字符

左旋字符

问题描述:

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

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

该问题有三种方法,现做一一分析

法一:通过移动字符实现左旋

#define _CRT_SECURE_NO_WARNINGS 1
#include
#includechar *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
",arr);system("pause");return 0;
}


法二:通过置换函数进行左旋操作

比如abcd1234,如果我们想左旋四个,我们可以先把前面四个逆序得到dcba,接着把后面逆序得到4321,这样两次逆序后的结果是dcba4321,然后再整体逆序,得到了1234abcd,同样的方法大家可以试一下左旋两个是不是同样的效果

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include//通过置换函数进行左旋操作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
",arr);system("pause");return 0;
}


法三:通过在拼接进行左旋,把和原字符串同样内容的字符串拼接在原字符串的后面

分析如下,如果我们的原字符串是abcd1234,现在我左旋2,想要得到的结果是cd1234ab,我使用本方法是在原字符串的后面拼接一整个,得到abcd1234abcd1234,然后从第三个字符开始把内容依次复制到原字符串中去,循环的次数是8.

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#include//通过在拼接进行左旋,把和原字符串同样内容的字符串拼接在原字符串的后面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位为了给结尾处留有一个''的空间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
",arr);system("pause");return 0;
}






更多相关:

  • 题目:最小的k个数 入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 示例 1: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 示例 2: 输入:arr = [0,1,2,1], k = 1 输出:[0...

  • //自定义深度复制对象or数组的递归方法---------------------------------------- let copyObjOrArr = o => {let isArray = o instanceof Array;let isObject = o instanceof Object;if (!isObject)...

  • var array = {/* 数组求和*/sum: arr => eval(arr.join("+")),/* 判断一个数组(支持一个字符串)里面的是否有任何一个元素被包含在了某个字符串里面 */isStringContain(str, arr) {Array.isArray(arr) || (arr = [arr]);for (v...

  • 经过调研发现,对任意无序整数数组,快速排序有两种实现方法,这里简单阐述下思路: 思路一:随意选择一个基准元,一般选择数组的起始元或末尾元,Weiss这本书上特意搞了个算法来选择基准元,……,总之就是基准元的选择要尽量随机。选定基准元之后,比如选择数组起始元为基准元,从数组右边开始,向左边遍历,遇到比基准元大的跳过,直至遇到比基准元小...

  • 下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序。整理出来以作备忘,不足之处,欢迎大家批评指正!其中计数排序分别给出了不稳定和稳定两种排序算法,测试时,使用随机生成大数组和随机手动输入的方法来测试。...

  • char* Reverse(char* s) {//将q指向字符串最后一个字符char* q = s ;while( *q++ ) ;q -= 2 ; //分配空间,存储逆序后的字符串。char* p = newchar[sizeof(char) * (q - s + 2)] ; char* r = p ;// 逆序存储whil...

  • 二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {"abc", "def", "ghi"}; 这种模型为二级指针的第一种内存模型,在理解的时候应该这样理解:定义了一个指针数组(char *...

  • 今天在弄一下啊小小程序的时候。报错,出现了问题。先看代码 int main(int argc, char* argv[]) {char *filename = "interface_ipset_1_1.json";char* split1 = "_";char* split2 = ".";char splitfile1[4][...

  • wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString....#include // 使用CString必须使用MFC,并且不可包含#define _AFXDLL#include us...

  • 问题的提出:设计一个用于管理朋友信息的程序。将朋友信息(年龄、姓名、电话)存放在MyFrd.dat中,从文件读出这些信息并显示,并能按姓名(要求可简化输入,如只输入姓氏便可查询)进行查询,将查询信息输出屏幕。 1 #include 2 #include 3 #include<...