资讯专栏INFORMATION COLUMN

牛课网编程~~倒置字符串

不知名网友 / 2762人阅读

摘要:倒置字符串前言解法思路解析解法完整代码解法思路解析解法完整代码最后的总结前言一道牛客网的编程题。。。倘若我们要倒置的字符串很长,新开辟空间会耗费资源的。

前言

一道牛客网的编程题。。。
题目地址

解法1思路解析

拿到题目之后,我的思考首先是使用原空间进行倒置还是新开辟一个数组去存放倒置的结果。
这里我选择了新开辟一个空间。
因为倒置到新的数组中的时候,I like Beijing.会变成 Beijing. like I
所以在旧数组中的操作,我们选择从数组最后端开始操作

上述过程在放置完Beijing.之后,p要向前寻找到like,然后是I,这是个循环的过程
因为当p指向了I的时候,前面的元素不是’ ",我们无法预料,那么这个情况多带带考虑,这样循环的条件就是当p!=str
代码部分实现:

	while (p != str)	{		char* t = p - 1;		if (*t == " ")		{			while ((*p) != "/0" && (*p) != " ")			{				*q++ = *p++;//q是指向新数组的指针			}			p = t + 1;			*(q) = " ";			q++;		}		p--;	}

当p==str的情况下,依旧是赋值到新的数组中

	while ((*str) != " ")	{		*q++ = *str++;	}	*q = "/0";	//注意当查找到str的时候,在新数组中,相当于到了结束的时候,所以在结尾加上/0,表示结束标志

解法1完整代码

void ReserveString(char* str){	int i = 0;	int len = strlen(str);	char b[100] = { 0 };	char* q = b;	char* p = str+len-1;	while (p != str)	{		char* t = p - 1;		if (*t == " ")		{			while ((*p) != "/0" && (*p) != " ")			{				*q++ = *p++;			}			p = t + 1;			*(q) = " ";			q++;		}		p--;	}	while ((*str) != " ")	{		*q++ = *str++;	}	*q = "/0";	printf("%s", b);}int main(){	char str[100] = {0};		gets_s(str);	ReserveString(str);	return 0;}

解法2思路解析

前面说到,在看到这个题目的时候,我的第一做法是开辟新的空间,进行倒置的存储,其实正常情况下,如果可以使用原空间,那么一定是最好的,毕竟我们要考虑时间复杂和空间复杂。倘若我们要倒置的字符串很长,新开辟空间会耗费资源的。
接下来的写法就是使用原空间的做法
首先:将这个字符串中的每一个单词逆序
然后:将整个字符串逆序一次
图解:

实现逆序操作的代码想必大家已经熟的不能再熟了
使用两个指针指向字符串前后两个位置,然后进行前后逆序
代码如下:

void resverse(char* left, char* right){	assert(left && right);//避免left,right为空指针	while (left < right)	{		char t = *left;		*left = *right;		*right = t;		left++;		right--;	}}

逆序三个单词的代码:

//start和end代表一个单词首尾指针while (*end != "/0")//条件是不遇到/0,不然之间还是有单词的	{		while (*end != " " && *end!="/0")		{			end++;		}		//逆序这两个指针之间的内容,相当于逆序单词		//注意end-1,因为此刻是end=" "了,单词是在" "前面的 		resverse(start, end - 1);				//指向下一个单词		//如果到了最后一个/0,start就不能往后走了		if (*end == "/0")		{						start = end;		}		//如果没有遇到就是正常的指向下一个单词		else		{			start = end + 1;		}		end = start;	}

逆序整个单词的代码:

	resverse(a, a + strlen(a) - 1);

解法2完整代码

#include#include#includevoid resverse(char* left, char* right){	assert(left && right);//避免left,right为空指针	while (left < right)	{		char t = *left;		*left = *right;		*right = t;		left++;		right--;	}}int main(){	char a[100] = { 0 };	gets_s(a);	char* start = a;	char* end = start;	while (*end != "/0")//条件是不遇到/0,不然之间还是有单词的	{		while (*end != " " && *end!="/0")		{			end++;		}		//逆序这两个指针之间的内容,相当于逆序单词		resverse(start, end - 1);		//指向了下一个单词		if (*end == "/0")		{			//如果到了最后一个/0,start就不能往后走了			start = end;		}		else		{			start = end + 1;		}		end = start;	}	//接下来整个串再逆序一下	resverse(a, a + strlen(a) - 1);	printf("%s", a);	return 0;}

最后的总结

当时写题目的时候是有时间限制的,我没有在规定的时间内完成代码,可以给大佬们看看我的代码

#include#includevoid ReserveString(char* str){	int i = 0;	int len = strlen(str);	char b[100] = { 0 };	char* q = b;	char* p = str+len-1;	while (p != str)	{		char* t = p - 1;		if (*t == " ")		{			while ((*p) != "/0" && (*p) != " ")			{				*q++ = *p++;			}			p = t + 1;			*(q) = " ";			q++;		}		p--;	}	while ((*str) != " ")	{		*q++ = *str++;	}	*q = "/0";	str = b;}int main(){	char str[100] = {0};		gets_s(str);	ReserveString(str);	printf("%s", str);	return 0;}

就是题解一的过程,不同的是当时在考虑的时候,想着指针是传递地址的,所以在倒置函数内部,我把新数组的空间赋给了str,然后返回到main函数中str找到b的首地址,完美的把后面的内容打印出来,当时以为是这么回事,后来截至时间过了之后调试了一把。。。。
函数结束后,函数内部的空间会被自动释放,b那个空间是个什么啊,还赋值给str了。。。。

各位大佬观看时如果发现错误,务必要及时指正我啊!

ps:说说最近,开通博客呢是想记录自己重学C语言的历程,但是距离上次博客已经是多久以前了,其实我花在C上的时间远远少于当时心中所想。所以说我在干什么呢。。。对接口。。感觉在写shi,循环里面发请求加异步还传多组参数。c,我究竟是什么丧心病狂。
然后又到了考试周,明天还有数据结构摸底测,希望快点放假,寒假我要好好学习!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125600.html

相关文章

  • 设计原则

    摘要:何为设计设计哲学中讲到的一些设计准则设计准则小即是美让每个程序只做好一件事快速建立原型先满足基本需求,再后续升级舍弃高效率而采取可移植性采用纯文本来存储数据可读性好充分利用软件的杠杆效应软件复用使用脚本来提高杠杆效应和可移植性避免强制性的用 何为设计 《Unix/Linux设计哲学》中讲到的一些设计准则: 设计准则 小即是美 让每个程序只做好一件事 快速建立原型(先满足基本需求,再后...

    DirtyMind 评论0 收藏0
  • 设计模式之软件设计七大原则

    摘要:引申意义子类可以扩展父类的功能,但不能改变父类原有的功能。含义当子类的方法实现父类的方法时重写重载或实现抽象方法,方法的后置条件即方法的输出返回值要比父类更严格或相等。优点约束继承泛滥,开闭原则的一种体现。降低需求变更时引入的风险。 0x01.开闭原则 定义:一个软件实体如类,模块和函数应该对扩展开放,对修改关闭 要点: 当变更发生时,不要直接修改类,而是通过继承扩展的方式完成变...

    ixlei 评论0 收藏0
  • 面向对象设计原则-依赖倒置

    摘要:依赖倒置在面向对象设计中有一个重要的原则是依赖倒置,主要作用是解耦,让对象与对象之间松耦合。现在根据依赖倒置原则对例子进行修改。 依赖倒置 在面向对象设计中有一个重要的原则是依赖倒置(Dependence Inversion Principle),主要作用是解耦,让对象与对象之间松耦合。定义如下:高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。...

    Zhuxy 评论0 收藏0
  • 面向对象基本原则(2)- 里式代换原则与依赖倒置原则

    摘要:四依赖倒置原则依赖倒置原则简介依赖倒置原则的英文名称是,简称。依赖倒置原则的表现其实就是面向接口编程。依赖倒置原则的优点减少类间的耦合性,提高系统的稳定性。结合里氏替换原则使用接口负责定义属性和方法,并且声明与其他对象的依赖关系。 面向对象基本原则(2)- 里式代换原则与依赖倒置原则 面向对象基本原则(1)- 单一职责原则与接口隔离原则面向对象基本原则(2)- 里式代换原则与依赖倒置原...

    liangdas 评论0 收藏0
  • 头条日常实习生面经2018.11.28

    摘要:共享内存是最快的方式,它是针对其他进程间通信方式运行效率低而专门设计的。套接字套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。来自的解释九什么受同源策略的限制,支持跨域一种新的通信协议标准。 第一次大公司面试的面经 此次面试说来也有点匆忙,本没想过自己会那么快就想去面试大公司,并且把自己第一次面大公司的各种不足展现得一览无余。当时11月20号左右身边...

    nanfeiyan 评论0 收藏0

发表评论

0条评论

不知名网友

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<