2. 反转单词的两种解决方案
编写一个函数,反转一个字符串中单词的顺序。例如,函数应该将字符串Life is better and better.转换成better. and better is Life。假定所有的单词都是以空格分隔的,标点也作为字母一样处理。 1. 通用的解决方法 通用解决方案的工作原理如下: 首先,需要
编写一个函数,反转一个字符串中单词的顺序。例如,函数应该将字符串“Life is better and better.”转换成“better. and better is Life”。假定所有的单词都是以空格分隔的,标点也作为字母一样处理。
1. 通用的解决方法
通用解决方案的工作原理如下:
首先,需要分配适当大小的临时缓冲区。然后,需要进行扫描循环,从字符串的最后一个字符开始。当发现非单词字符时,可以将它直接写到缓冲区中去。但是,当发现单词字符时,不能立即将它写入临时缓冲区。因为是在反向扫描这个字符串,遇到的第一个字符,正好是这个单词的最后一个字符,所以如果按发现字符的顺序复制,会使每个单词中的字符发生反转。所以,需要继续扫描,直到找到这个单词的第一个字符,再将这个单词的每个字符以正确的、不反转的顺序进行复制。当复制一个单词的字符时,需要确定这个单词的结尾,这样才能知道何时停止复制。可以通过检查每个字符是否是单词字符来实现这一点,但因为已经知道了这个单词最后一个字符的位置,更好的方法是进行复制直至到达这个位置。
程序代码如下:
#include "stdafx.h"
#include
#include
#include
bool reverseWords(char str[])
{
char *buffer;
int tokenReadPos, wordReadPos, wordEnd, writePos = 0;
// Position of the last character is length - 1
tokenReadPos = strlen(str) - 1;
buffer = (char*)malloc(tokenReadPos + 2);
if(!buffer)
return false; // reverseWords failed
while(tokenReadPos >= 0)
{
if(str[tokenReadPos] == ' ') // Non-word characters
{
// Write character
buffer[writePos++] = str[tokenReadPos--];
}
else // Word character
{
// Store position of end of word
wordEnd = tokenReadPos;
// Scan to next non-word character
while(tokenReadPos >= 0 && str[tokenReadPos] != ' ')
tokenReadPos--;
// tokenReadPos went past the start of the word
wordReadPos = tokenReadPos + 1;
// Copy the characters of the word
while(wordReadPos {
buffer[writePos++] = str[wordReadPos++];
}
}
}
// null terminate buffer and copy over str
buffer[writePos] = '/0';
strcpy(str, buffer);
free(buffer);
return true; // ReverseWords successful
}
int main()
{
char str[] = "Life is better and better!";
cout reverseWords(str);
cout
return 0;
}
程序的运行结果如下图所示:
2. 专用的解决方法:
专用解决方法的原理如下:
首先,将整个字符串进行反转。然后,对反转后的每个单词进行反转。与通用解决方法相比,专用解决方法的好处是不需要缓冲区。
程序代码如下:
#include "stdafx.h"
#include
#include
void reverseString(char str[], int start, int end)
{
char temp;
while(end > start)
{
// Exchange characters
temp = str[start];
str[start] = str[end];
str[end] = temp;
// Move indices towards middle
start++; end--;
}
}
void reverseWords(char str[])
{
int start = 0, end = 0, length;
length = strlen(str);
// Reverse entire string
reverseString(str, start, length - 1);
while(end {
if(str[end] != ' ') // Skip non-word characters
{
// Save positions of beginning of word
start = end;
// Scan to next non-word character
while(end end++;
// Back up to end of word
end--;
// Reverse word
reverseString(str, start, end);
}
end++; // Advance to next token
}
}
int main()
{
char str[] = "Life is better and better!";
cout reverseWords(str);
cout
return 0;
}
程序的执行结果如下:

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

C++中机器学习算法面临的常见挑战包括内存管理、多线程、性能优化和可维护性。解决方案包括使用智能指针、现代线程库、SIMD指令和第三方库,并遵循代码风格指南和使用自动化工具。实践案例展示了如何利用Eigen库实现线性回归算法,有效地管理内存和使用高性能矩阵操作。

Go语言提供了两种动态函数创建技术:closures和反射。closures允许访问闭包作用域内的变量,而反射可使用FuncOf函数创建新函数。这些技术在自定义HTTP路由器、实现高度可定制的系统和构建可插拔的组件方面非常有用。

在C++函数命名中,考虑参数顺序至关重要,可提高可读性、减少错误并促进重构。常见的参数顺序约定包括:动作-对象、对象-动作、语义意义和遵循标准库。最佳顺序取决于函数目的、参数类型、潜在混淆和语言惯例。

1、 SUM函数,用于对一列或一组单元格中的数字进行求和,例如:=SUM(A1:J10)。2、AVERAGE函数,用于计算一列或一组单元格中的数字的平均值,例如:=AVERAGE(A1:A10)。3、COUNT函数,用于计算一列或一组单元格中的数字或文本的数量,例如:=COUNT(A1:A10)4、IF函数,用于根据指定的条件进行逻辑判断,并返回相应的结果。

C++函数中默认参数的优点包括简化调用、增强可读性、避免错误。缺点是限制灵活性、命名限制。可变参数的优点包括无限灵活性、动态绑定。缺点包括复杂性更高、隐式类型转换、调试困难。

Java框架安全漏洞分析显示,XSS、SQL注入和SSRF是常见漏洞。解决方案包括:使用安全框架版本、输入验证、输出编码、防止SQL注入、使用CSRF保护、禁用不需要的功能、设置安全标头。实战案例中,ApacheStruts2OGNL注入漏洞可以通过更新框架版本和使用OGNL表达式检查工具来解决。

C++中的函数返回引用类型的好处包括:性能提升:引用传递避免了对象复制,从而节省了内存和时间。直接修改:调用方可以直接修改返回的引用对象,而无需重新赋值。代码简洁:引用传递简化了代码,无需额外的赋值操作。
