首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现StrStr()

实现StrStr()
EN

Code Review用户
提问于 2014-12-15 19:21:48
回答 3查看 3.1K关注 0票数 8

这是一个简单的实现--我知道有些算法像KMP

然而,我正试图尽我所能地实现它。

代码语言:javascript
复制
string test = "giladdarmonwhatareyoudoing";
int index = StrStr(test, "are");


//Returns an index to the first occurrence of str2 in str1,
//or a -1 pointer if str2 is not part of str1.

public int StrStr(string test, string strToFind)
{
    for (int i = 0; i < test.Length; i++)
    {
        if (test[i] == strToFind[0])
        {
            int j;
            for (j = 0; j < strToFind.Length; j++)
            {
                if (test[i + j] != strToFind[j])
                {
                    break;
                }
            }
            if (j == strToFind.Length)
            {
                return i;
            }
        }
    }
    return -1;
}
EN

回答 3

Code Review用户

回答已采纳

发布于 2014-12-16 10:00:25

算法

  • 您的实现有一些严重的错误和意想不到的行为。
    • 如果将String.Empty作为第二个参数传递,则抛出一个IndexOutOfRangeException
    • 如果将附加至少一个字符的第一个参数的唯一结尾部分传递给第二个参数,则抛出一个IndexOutOfRangeException字符串test = "giladdarmonwhatareyoudoing";int index = StrStr(test,"ng1");
    • 如果要将null作为第一个或第二个参数传递,则抛出一个NullReferenceException。在这里,最好使用ArgumentNullException子句抛出一个守护语句。如果(测试==空){抛出新ArgumentNullException(“测试”);} if (strToFind ==空){抛出新ArgumentNullException("strToFind");}

  • 您的实现可以通过来改进
    • 检查是否为strToFind.Length > test.Length
    • 检查是否为test.Length - i > strToFind.Length

命名

你不应该用匈牙利符号。考虑将strToFind重命名为searchFormsearchArgument

重构

将内部循环提取到单独的方法之后,删除现在不需要的if (test[i] == strToFind[0])并实现上面的内容

代码语言:javascript
复制
public int StrStr(string value, string searchArgument)
{
    if (value == null) { throw new ArgumentNullException("value"); }
    if (searchArgument == null) { throw new ArgumentNullException("searchArgument"); }
    if (searchArgument.Length == 0) { return 0; }

    int searchLength = searchArgument.Length;
    int length = value.Length;

    if (searchLength > length) { return -1; }

    for (int i = 0; i < length; i++)
    {
        if (length - i < searchLength) { return -1; }

        if (IsMatchAtIndex(value, searchArgument, i)) { return i; }
    }
    return -1;
}

private bool IsMatchAtIndex(String value, String searchArgument, int startIndex)
{
    for (int j = 0; j < searchArgument.Length; j++)
    {
        if (value[startIndex + j] != searchArgument[j])
        {
            return false;
        }
    }
    return true;
}  

我更喜欢上面的,但你也可以加上

代码语言:javascript
复制
if (length - i < searchLength) { return -1; }  

倒置为for循环的条件

代码语言:javascript
复制
for (int i = 0; i < length && length - i >= searchLength; i++)
{
    if (IsMatchAtIndex(value, searchArgument, i)) { return i; }
}
票数 11
EN

Code Review用户

发布于 2014-12-15 19:45:31

//返回str2在str1中第一次出现的索引,如果str2不是str1的一部分,则返回//或a-1指针。公共int StrStr(string test,string strToFind)

该注释作为XML注释要好得多,这样客户端代码就可以看到使用IntelliSense的方法的文档:

代码语言:javascript
复制
/// <summary>
/// Returns an index to the first occurrence of str2 in str1,
/// or a -1 pointer if str2 is not part of str1.
/// </summary>
public int StrStr(string test, string strToFind)

另一个问题是,注释中提到的str1str2参数不是您使用的实际参数名称。您可以使用paramref

代码语言:javascript
复制
/// <summary>
/// Finds the index of the first occurrence of <paramref name="test"/> in <paramref name="strToFind"/>.
/// </summary>
/// <param name="test">The input string.</param>
/// <param name="strToFind">The value to find.</param>
/// <returns>Returns -1 if specified value is not found.</returns>
public int StrStr(string test, string strToFind)

MSDN

<paramref>标记为您提供了一种方法来指示代码注释中的单词(例如,在<summary><remarks>块中)是指参数。可以处理XML文件,以某种不同的方式格式化这个单词,例如使用粗体或斜体。

使用<returns>标记来指定函数的返回值-- <summary>标记应该简单地说明该函数的功能,而不是涵盖所有可能的结果。

票数 7
EN

Code Review用户

发布于 2014-12-15 19:42:37

主要是一些小事:

  1. 您可能从C函数中取了这个名称,但是StrStr实际上不是一个很好的名称。StartIndexOf或类似的可能更好。
  2. 您可以将其作为string的扩展方法编写,这将产生更好的调用语法。它应该是这样的:公共静态int StartIndexOf(此字符串测试,字符串toFind) {.},并这样称呼它: string test = "giladdarmonwhatareyoudoing";int index = test.StartIndexOf("are");
票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/73754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档