【算法之道】之字符串逆序输出

一、前言

字符串的逆序输出是一道经典面试题,要实现并不难,但是面试官希望看到的是面试者能否运用最简短的代码更高效的实现字符串的逆序功能。换句话说,就是做到三点:时间复杂度、空间复杂度、代码可读性。不管任何代码做到了这三点才算是好的代码。
那接下来我将介绍两种实现字符串逆序的方法,具体见下文。

二、实现字符串的逆序输出

方法一:异或法

这种方法是一种比较精简的方法,直接使用二进制来运算,更多的不说,看到代码大家就明白了。
char *reverse_str(char *str)
{
	size_t len = 0;
	unsigned int i, j;

	len = strlen(str);

	for(i=0,j=len-1; i<j; i++,j--)
	{
		str[i] ^= str[j];
		str[j] ^= str[i];
		str[i] ^= str[j];
	}

	return str;
}


方法二:折半对调法

折半对调法是我自己取的名,可能不是太准确勿怪。原理就是定义一个中间变量从头尾开始依次交换直到走到字符串中间一个字符。
char *reverse_str(char *str)
{
	size_t len = 0;
	unsigned int i;
	char temp;

	len = strlen(str);

	for(i=0; i<len/2; i++)
	{
		temp = str[i];
		str[i] = str[len-i-1];
		str[len-i-1] = temp;
	}

	printf("str reverse: %s\n", str);

	return str;
}

或者定义两个变量i ,j
char *reverse_str(char *str)
{
	size_t len = 0;
	unsigned int i, j;
	char temp;

	len = strlen(str);

	for(i=0, j=len-1; i<j; i++,j--)
	{
		temp = str[i];
		str[i] = str[j];
		str[j] = temp;
	}

	printf("str reverse: %s\n", str);

	return str;
}




总结:无论是异或法和折半对调法,这两种方法的时间复杂度和空间复杂度都很小。到目前为止是本人认为两种比较可行的方法,如果大家有什么更好的方法,欢迎分享交流。
网上也有很多其他的方法,像开辟新空间等方法这里就不做介绍了,本人认为在代码中如果可以做到不去申请新内存那就最好不要去做,一个变量可能觉得没什么但是积少成多,尤其是在嵌入式设备中,内存是很宝贵的,所以不建议这么做。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值