**已关闭。**此问题需要debugging details。目前不接受回答。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答问题。
2天前关闭。
Improve this question的
我正在做“1662.检查两个字符串数组是否等价”。
我在VisualStudio上编写的解决方案代码给出了正确的输出,即false,但是当我在Leetcode上键入相同的代码时,它说它给出了输出true,我不知道为什么它应该给出false输出
#include <iostream>
#include <string>
using namespace std;
int main() {
string word1[] = { "a","cb" }, word2[] = { "ab","c" };
string com1 = "", com2 = "";
int size1 = sizeof(word1) / sizeof(word1[0]), size2 = sizeof(word2) / sizeof(word2[0]);
for (int i = 0; i < size1; i++) {
com1 += word1[i];
}
for (int i = 0; i < size2; i++) {
com2 += word2[i];
}
if (com1 == com2) {
cout << "true";
}
else {
cout << "false";
}
return 0;
}
字符串
1条答案
按热度按时间mctunoxg1#
这个帖子里有一些东西是给每个人的。
Maven级的C++程序员会发现@Marek R发布的优雅解决方案是一种乐趣。他使用范围库来生成一行解决方案:
正确的解决方案,它不会在LeetCode(旧的标准库). godbolt.org/z/a3GK7b7GT上编译。
字符串
对于初学者来说,OP中使用的算法并不可耻。他只是简单地连接组成一个单词的所有字符串,然后比较结果。毫无疑问,这是非常低效的,但它确实有效。如果你是一个C++新手,这是一个可以接受的解决方案。
然而,当LeetCode提交这样的解决方案时,可能会出现问题。我怀疑LeetCode会在测试中使用一些相当长的字符串。这可能会导致运行时不佳,内存占用率高。
对于中级程序员,我们有@Jarod42给出的提示:
顺便说一句,你不需要创建大字符串...
技巧是对每个单词向量进行一次遍历,并跟踪接下来要比较的字符串和字符的位置。我为此编写了一个夸张的版本,其中包括一个迭代器类来跟踪位置。(见下文)
OP的问题
当我在Leetcode上输入相同的代码时...[它给出了不正确的输出]。
这是因为
std::vector
(LeetCode解决方案使用)和内置数组(函数main
使用)的不兼容性。您不能简单地 * 键入相同的代码。* 您必须修改函数main
中的代码,使其使用std::vector
。@PaulMcKenzie概述了在Visual Studio中解决LeetCode问题的最佳方法。您必须从LeetCode网站复制类
Solution
,并编写函数main
以与之接口。下面是我在我的解决方案中使用的框架。注意,它从LeetCode网站复制了
Solution
* 类。型
类
Solution
只是一个存根,但是,这个程序运行,并为所有三个例子产生答案false
。型
在上面的框架中,我没有完成类
Solution
。这是故意的。我希望OP能找出如何在这个框架中编写他的算法。使用迭代器跟踪字符串和字符位置
本节介绍了另一种解决方案,即使用迭代器来扫描“单词”。
这种方法的优点是
operator==
代码的简单性,它实际上与您可能编写的比较两个字符串的代码相同。型
通过调用标准库函数
std::equal
来比较单个字符,您可以做得更好。型
下面是
Word
类的其余部分。它嵌套在Solution
类中。成员函数cbegin
和cend
分别返回迭代器到Word
的开头和结尾。成员函数length
调用标准库函数std::accumulate
来计算Word
中所有字符串长度的总和。型
在类
Solution
中,注意函数arrayStringsAreEqual
的简单性。它构造了两个临时Word
对象,然后使用类Word
中的operator==
对它们进行比较。最后,下面是struct
Const_Iterator
的代码。型