C语言多种方法实现一个函数左旋字符串中K个字符

目录
  • 前言
  • 法一、将左旋1次这个动作执行k次
  • 法二、多次逆序字符串

前言

今天看到一个有趣的笔试题:实现一个函数,可以左旋字符串中的k个字符。示例如下:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

提示:以下是本篇文章正文内容,下面案例可供参考

法一、将左旋1次这个动作执行k次

这个方法的思路我来简单介绍一下:
现有1个字符串abcd

我们将a移出来,然后bcd前会空出一个位置

将bcd向前移动一个位置,最后把a放入最后一个位置,即可完成1次左旋

那么1次完成了,对于左旋k次呢?实际上也就是把上述操作再执行k-1次。
代码如下(示例):

#include<stdio.h>
#include<assert.h>
void left_move(char*arr, int k)//arr传过来的是首元素地址,你可以用一个指针去接收
{
    assert(arr);
	int i = 0;
	int len = strlen(arr);//计算arr的长度
	for (i = 0;i < k;i++)
	{

		int j = 0;
		char tmp = *arr;
		for (j = 0;j < len - 1;j++)
		{
			arr[j] = arr[j + 1];//arr[j]=*(arr+j)
		}
		arr[len - 1] = tmp;
	}
}
int main()
{
	int x = 0;
	char arr[] = "abcd";
	printf("输入你想左旋几个字符:\n");
	scanf("%d", &x);
	left_move(arr, x);
	printf("%s\n", arr);
}

ps:这里多使用一个assert是为了防止函数传过来的是空指针,会进行断言,如果传的是空指针,系统会报错

法二、多次逆序字符串

我们以ABCDEF左旋2次进行举例:

左旋2次也就是把AB移动到CDEF后面,下面看我操作,先将AB、CDEF分为两个组

将两个组分别逆序

最后整体逆序得到最终结果CDEFAB

那么左旋k次也就是把2变成k即可,整体仍然是这3个步骤,非常方便

代码如下(示例):

#include<stdio.h>
#include<assert.h>
void reverse(char*l, char*r)//逆序函数
{
	assert(l&&r);
	while (l < r)
	{
		char tmp = *l;
		*l = *r;
		*r = tmp;
		l++;
		r--;
	}
}
void left_move(char*arr, int k)
{
	assert(arr);
	int len = strlen(arr);
	reverse(arr,arr+k-1);//第一个组逆序
	reverse(arr+k,arr+len-1);//第二个组逆序
	reverse(arr,arr+len-1);//整体逆序
}
int main()
{
	int x = 0;
	char arr[] = "abcdef";
	printf("输入你想左旋几个字符:\n");
	scanf("%d", &x);
	left_move(arr, x);
	printf("%s\n", arr);
}

ps:关于每一次的逆序函数:以abcd举例,就是a和d换位,b和c换位,得到dcba,然后这样的逆序进行三次即可得到所谓的左旋。

以上就是C语言多种方法实现一个函数左旋字符串中K个字符的详细内容,更多关于多种方法实现一个函数的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用C语言实现字符串左旋和右旋问题

    1.实现一个函数,可以左旋字符串中的k个字符. ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB  1.暴力移位法 #include <stdio.h> #include <stdlib.h> #include <string.h> void left_move(char*str, int k) { int len = 0; int i = 0; while (k--) { //1.把第一个保存起来 char tmp = *str; //2.后面的向后

  • 字符串的组合算法问题的C语言实现攻略

    基本字符串组合问题 题目:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. 上面我们详细讨论了如何用递归的思路求字符串的排列.同样,本题也可以用递归的思路来求字符串的组合. 假设我们想在长度为n的字符串中求m个字符的组合.我们先从头扫描字符串的第一个字符.针对第一个字符,我们有两种选择:第一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符:第二是不把这个字符放到组合中去,接下来我们需要在剩下的n

  • C语言中求字符串长度的函数的几种实现方法

    1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { assert(str != NULL); int count = 0; while (*str != '\0') { count++; str++; } return count; } 2.不创建计数器,从前向后遍历一遍,没有遇到'\0'就让指针向后加一,找到最后一个字符,记下来地址,然后用最后一个字符的地址减去起始地址,就得到了字符串的长度.

  • C语言字符串旋转问题的深入讲解

    目录 字符串的旋转: 实现旋转字符串: 1.暴力求解法: 2.三步翻转法 判断一个字符串是否由另一个字符串旋转而来 1.暴力求解法: 2.优化算法: 关于用到的函数扩展: 1.assert 2.strcmp 3.strcat 4.strncat 5.strstr 总结 字符串的旋转: ABCD左旋一个字符为BCDA ABCD左旋两个字符为CDAB ABCD右旋一个字符为DABC ABCD右旋两个字符为CDAB 这里只写了左旋,右旋的原理和左旋一样. 实现旋转字符串: 1.暴力求解法: 思路: 假

  • C语言多种方法实现一个函数左旋字符串中K个字符

    目录 前言 法一.将左旋1次这个动作执行k次 法二.多次逆序字符串 前言 今天看到一个有趣的笔试题:实现一个函数,可以左旋字符串中的k个字符.示例如下: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 提示:以下是本篇文章正文内容,下面案例可供参考 法一.将左旋1次这个动作执行k次 这个方法的思路我来简单介绍一下: 现有1个字符串abcd 我们将a移出来,然后bcd前会空出一个位置 将bcd向前移动一个位置,最后把a放入最后一个位置,即可完成1次左旋 那么1次完成了,对于左旋

  • strpos() 函数判断字符串中是否包含某字符串的方法

    用php的strpos() 函数判断字符串中是否包含某字符串的方法 判断某字符串中是否包含某字符串的方法 if(strpos('www.idc-gz.com','idc-gz') !== false){ echo '包含'; }else{ echo '不包含'; } PHP strpos() 函数 strpos() 函数返回字符串在另一个字符串中第一次出现的位置. 如果没有找到该字符串,则返回 false. 语法 strpos(string,find,start) 参数 描述 string 必需

  • 用JS编写一个函数,返回数组中重复出现过的元素(实例)

    用JS编写一个函数,返回数组中重复出现过的元素,见下面的代码: var arr = [1, 2, 3, 1, 2, 3, 4, 5]; var getRepeat = function (arr) { var obj = {}; for (var i = 0, len = arr.length; i < len; i++) { if (obj[arr[i]] == undefined) { obj[arr[i]] = 1; } else { obj[arr[i]]++; } } for (var

  • Lua判断字符串中包含中文字符的方法和计算字符串宽度函数分享

    一.判断字符串中包含中文字符的方法 遍历数组,对每个字节使用string.byte(),发现有大于127的,就是汉字,可以参照下面的代码. 二.计算字符串宽度函数 复制代码 代码如下: -- 计算字符串宽度   local str = "Jimmy: 你好,世界!" local fontSize = 20 local lenInByte = #str local width = 0   for i=1,lenInByte do     local curByte = string.by

  • 通过一个map替换字符串中指定的字符变量方法

    项目中需要生成一个合约,存放在mysql对应的text类型的属性里, 合约的内容对于每个用户来说大致都一样,但有几个地方需要替换成对应的信息, 比如,甲方,乙方的名字,合约的日期,合约的金额. 本来想找个第三方的jar包来实现这个功能,但找了很久都没有合适的,于是自己写了个简单的方法. package com.test; import java.util.HashMap; import java.util.Map; public class StringFormat { public stati

  • 一个可以删除字符串中HTML标记的PHP函数

    一个可以删除字符串中HTML标记的PHP函数作者:limote 当访客留言和发帖时,我们并不希望访客在留言和帖子中使用HTML标记,所以在访客提交留言和帖子时我门得把HTML标记删除,下面的函数就是实现此功能的函数 <? function delete_htm($scr) { for($i=0;$i<strlen($scr);$i++) { if(substr($scr,$i,1)=="<") { while(substr($scr,$i,1)!=">

  • php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)

    php ucwords() 函数将字符串中每个单词的首字符转换为大写, 本文章向码农介绍php ucwords() 函数的基本使用方法和实例,感兴趣的码农可以参考一下. 定义和用法 ucwords() 函数把字符串中每个单词的首字符转换为大写. 注释:该函数是二进制安全的. 相关函数: lcfirst() - 把字符串中的首字符转换为小写 strtolower() - 把字符串转换为小写 strtoupper() - 把字符串转换为大写 ucfirst() - 把字符串中的首字符转换为大写 语法

  • js replace(a,b)之替换字符串中所有指定字符的方法

    如下所示: var str = 'abcadeacf'; var str1 = str.replace('a', 'o'); alert(str1); // 打印结果: obcadeacf var str2 = str.replace(/a/g, 'o'); alert(str2); //打印结果: obcodeocf, 注意: 此处replace的第一个参数为正则表达式,/g是全文匹配标识. 以上这篇js replace(a,b)之替换字符串中所有指定字符的方法就是小编分享给大家的全部内容了,

  • python 巧用正则寻找字符串中的特定字符的位置方法

    假定字符串为: 小明买冰棍花了5元,买糖果花了3元,买游戏花了59元,小明今天一共花了67元. 要找到字符串中所有"元"所在的位置,只需几行代码即可搞定. import re str=u'小明买冰棍花了5元,买糖果花了3元,买游戏花了59元,小明今天一共花了67元.' word = u'元' a = [m.start() for m in re.finditer(word, str)] print a 结果为 [8, 16, 25, 37],说明"元"出现的位置在第

  • Java中字符串中连续相同字符去重方法

    最近参加了一个面试,问到了如何在一个字符串中连续相同字符去重,想了想用正则表达式应该可以轻松实现.可是由于长时间没有编码了,而且由于原先的工作用到的比较少.具体的自己就不会写正则表达式用到的类名什么的了.总之就是面试没有过了. 回来再网上搜了搜,本来以为可以很容易找到相应的内容,可是找了半天没有找到我想要的结果.后来在某个相似问题求助中看到了相应答案,不过还是有所区别,根据该问题的解决思路,最后实现了. 代码如下: public class Test { public static void m

随机推荐