翻转字符串(剑指offer-58)

本文介绍了一种字符串翻转的方法,通过先整体逆序再局部逆序单词来达到翻转单词次序的目的。同时对比了char *p与char p[]在C++中的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目描述

    输入一个字符串,翻转单词的次序。比如输入:"i am a student",输出:"student a am i"

2、解题思路

    首先整个字符串进行逆序。逆序之后,接着对每个单词进行逆序,时间复杂度为O(n)。代码如下:

#include<iostream>
using namespace std;

void Reverse(char* begin, char* end) {
	while (begin < end) {
		char temp = *begin;
		*begin = *end;
		*end = temp;
		begin++;
		end--;
	}
}

//翻转字符串,比如输入:"i am a student",输出:student a am i
int main() {	
	char input[1000];
	cin.get(input, 1000);
	int len = strlen(input);
	Reverse(input, input+len-1);
	char* begin = input;
	char* end = input;
	for (int i = 0; i < len; i++) {
		if (*end != 32) {
			end++;
		}
		else {
			Reverse(begin, --end);
			end++;
			while (*end == 32)end++;
			begin = end;
		}
	}
	cout << input << endl;
	return 0;
}

3、关于char *p ="hello“和char p[] = "hello"的区别

(1)char *p = "hello"中,“hello”是一个字符串常量,存在静态代码段中,因此不能修改这个字符串常量的值。sizeof(p)=4。

(2)char p[] = "hello"中,“hello”是一个字符串局部变量,位于栈中,是可以被修改的,并且这个字符串以'/0'结尾。siziof(a)=6,strlen(a)=5。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值