Leet-Code 剑指 Offer 58 - II. 左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

原题地址:
原题

或直接转到:
https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/

我的题解:

char* reverseLeftWords(char* s, int n){
	int q=0;
	while(1){
		if(*(s+q)=='\0'){
			break;
		}
		q++;
	}
    int i,j,k,m;
    char zfc[10001];
    k=0;
    for(i=0;i<q;i++){
    	zfc[i]=' ';
	}//初始化 
    for(m=0;m<(q-n);m++){
    	zfc[m]=s[m+n];
	}//先装入后几位 
	
	for(j=0;j<n;j++){
		zfc[m+j]=s[j];
	}
	
	for(k;k<q;k++){
		s[k]=zfc[k];
	}//返回原大小数组 
	return s;
}//Func_reverseLeftWords

写这个程序的时候思路非常清晰,就是会出现不可名状的错误,让我很费解,纠结了得有三个小时。现在想想也挺傻的,当祭天了吧,卡住我的重点会下划线标出来。

  1. 首先明确题干,没说不可以创建中转数组,难度降低了。
  2. 题目中给出字符串长度的范围,我们直接创建一个足够大的数组就可以了,其实也可以创建动态链表,不过用的不熟练,之后会单独练习的。
  3. 由于是将字符串数组的前几位塞到后面,而整体数量不变,也可以看作是一个平移切割,这里的重点是拿捏到切割的点。
  4. 我原来是直接用sizeof(s),而函数内外的sizeof(s)所占空间不一样!!!

我分别测量了实参s所占空间和形参s所占空间,结果很有意思。
–首先实参很正常,是数组元素数量加上一个“\0”的数量,也就是大小n+1
–而形参大小却变成了8
根据我的思考和查阅,应该是编译器的特性,传参前是数组,因此直接显示数组的大小。而传参后默认是一个指针,至于指针和数组的关系。数组就是指针,这个编译器是知道的。可是传参后指针就失去了参照,也就是说系统不知道指针原来是个什么数组。这时sizeof函数取到的就是指针所占空间,8字节,我佛了。

  1. 发现问题后就去解决问题,由于指针是C最基本的工具,因此可以通过指针指向内存的值来判断数组大小,利用for循环寻找到指针的后指内存,直到寻找到“\0”,也就是数组的结束标志。这中间需要一个类“计数器”,创建一个变量来记录成功判断的次数即可,最后得到的就是数组大小,利用这个大小来对数组内的元素进行定位即可
  2. 我的思路是先取出原数组的后几位,因为这是目标数组的前几位,这个前后无所谓,思路不一样罢了。因此就取到q-n,其中q为数组大小,n为移动位数。
  3. 第二次赋值自然就是装入前几位了,由于前一个for中的 m 已经是新创建数组所拥有的元素数量了,我们可以直接进行无缝衔接,利用上一个m直接写入这个for,小耦合,程序会舒服点

至于需不需要初始化,这里我为了程序舒服点,我进行初始化了,占用了一点内存,不过最后成绩不错。
我最难受的就是这个传参,数组传入名字,传入之后就变成指针变量的大小而不是数组的大小了,我还是没有程序严谨,可惜。

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值