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

一、前言

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

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

方法一:异或法

这种方法是一种比较精简的方法,直接使用二进制来运算,更多的不说,看到代码大家就明白了。
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;
}




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


你可能感兴趣的:(算法,面试题,字符串逆序,字符串逆序输出)