C语言习题——倒置字符串及单词倒排问题

倒置字符串原题链接

倒置字符串_好未来笔试题_牛客网 (nowcoder.com)

下面给出代码:

#include <stdio.h>
#include <string.h>
void reverse(char* left, char* right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[100] = { 0 };
	gets(arr);
	int len = strlen(arr);
	//逆序整个字符串
	reverse(arr, arr + len - 1);
	//逆序单词
	char* cur = arr;
	char* start = arr;
	while (*cur != '\0')
	{
		while (*cur != ' ' && *cur != '\0')
		{
			cur++;
		}
		reverse(start, cur - 1);
		if (*cur != '\0')
		{
			start = cur + 1;
			cur++;
		}
	}
	printf("%s\n", arr);
	return 0;
}

思路是先逆序整个字符串再逆序每个单词

注意的是在逆序每个单词时,当*cur为空格时,cur-1才是一个单词的结尾,cur+1是下一个单词开始的位置,逆序单词是一个重复的过程,所以当cur != '\0'时循环不断进行,而在逆序单词的时候,当*cur=‘\0’时,说明所有单词已经逆序完毕,所以此时的cur就不需要再++,start指针也就不需要重新赋值了。

单词倒排问题原题链接:

单词倒排_牛客题霸_牛客网 (nowcoder.com)

代码如下:

#include <stdio.h>
int main()
{
	char str[10001] = { 0 };//字符串最长10000
	int row = 0;
	while (gets(str) > 0)
	{
		char* ptr = str;
		char* word[10000] = { NULL };
		while (*ptr != '\0')
		{
			//如果是个字母字符,则是单词的起始字符
			if (('z' >= *ptr && *ptr >= 'a') || ('Z' >= *ptr && *ptr >= 'A')) 
			{
				word[row++] = ptr;//保存每个单词的起始地址
				//把本次的单词字母字符走完,直到遇到非字母字符
				
				while((*ptr != '\0') &&('z' >= *ptr && *ptr >= 'a') || ('Z' >= *ptr && *ptr >= 'A'))
				{
					ptr++;
				}
				continue;//不能继续向下,因为下边的ptr++会跳过当前的非字母字符
			}
			*ptr = '\0';//把非字母的数据全部替换为结尾标志
			ptr++;
		}
		for (int i = row - 1; i >= 0; i--)
		{
			printf("%s ", word[i]);//针对所有单词的起始地址逆序开始打印即可
		}
		return 0;
	}
}

注释很详细,不再赘述。

水平有限欢迎指正。

上一篇:C++ string实用总结


下一篇:React useEffect 无法更新函数变量