algorithm - "spacify"CamelCased 字符串的算法

标签 algorithm language-agnostic string

非常基础,我只是好奇其他人如何实现这个算法,并想看看是否有任何聪明的技巧来优化算法......我只是必须为我正在从事的项目实现这个。

给定一个 CamelCase 字符串,你将如何“空间化”它?

例如鉴于 FooBarGork 我想要 Foo Bar Gork 回来。

这是我在 C# 中的算法:


static void Main(string[] args)
{
    Console.WriteLine(UnCamelCase("FooBarGork"));
}
public static string UnCamelCase(string str)
{
    StringBuilder sb = new StringBuilder();
    for (int i =  0; i < str.Length; i++)
    {
        if (char.IsUpper(str, i) && i > 0) sb.Append(" ");
        sb.Append(str[i]);
    }
    return sb.ToString();
}

由于您必须访问每个字符一次,我认为最好的情况是 O(n)。您将如何实现?

最佳答案

我已经能感觉到火焰了,但我喜欢这种东西的正则表达式。

public static string UnCamelCase(string str)
{
    return Regex.Replace(str, "([a-z])([A-Z])", "$1 $2");
}

(这可能不会比您的实现速度更快,但对来说它更清楚。)

显然,这会更快(在运行时)

private static Regex _unCamelRegex = new Regex("([a-z])([A-Z])", RegexOptions.Compiled);

public static string UnCamelCase(string str)
{
    return _unCamelRegex.Replace(str, "$1 $2");
}

这将解决 Pete Kirkham 提出的问题 below (就像 HTTPRequest 这样的驼峰式字符串而言):

private static Regex _unCamelRegex1 = new Regex("([a-z])([A-Z])", RegexOptions.Compiled);
private static Regex _unCamelRegex2 = new Regex("([A-Z]+)([A-Z])([a-z])", RegexOptions.Compiled);

public static string UnCamelCase(string str)
{
    return _unCamelRegex2.Replace(_unCamelRegex1.Replace(str, "$1 $2"), "$1 $2$3");
}

这个接受 HTTPRequestFOOBarGork 并返回 HTTP Request FOO Bar Gork


因此,我使用 OPs 实现(使用“从 1 开始并跳过 > 0 检查”更改)和我的第二个回复(带有静态编译的 Regex 对象的回复)针对正则表达式方法测试了迭代方法。请注意,结果不包括 Regex 的编译时间。对于 200 万次调用(使用相同的 FooBarGork 输入):

迭代: 00:00:00.80
正则表达式: 00:00:06.71

因此很明显迭代方法的效率。我已经包含了一个固定版本的 OPs 实现(Jason Punyon 的 as suggested,任何功劳都应该归于他),它也考虑了 null 或空参数:

public static string UnCamelCaseIterative(string str)
{
    if (String.IsNullOrEmpty(str))
        return str;

    /* Note that the .ToString() is required, otherwise the char is implicitly
     * converted to an integer and the wrong overloaded ctor is used */
    StringBuilder sb = new StringBuilder(str[0].ToString());
    for (int i = 1; i < str.Length; i++)
    {
        if (char.IsUpper(str, i))
            sb.Append(" ");
        sb.Append(str[i]);
    }
    return sb.ToString();
}

关于algorithm - "spacify"CamelCased 字符串的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/484085/

相关文章:

algorithm - 在无向图上查找所有路径

mysql - 在非地理环境中寻路

algorithm - 制作不同字长的词表?

java - SUPER 类应该从它的 SUBCLASS 中获取函数和属性。在Java中有可能吗?

Mysql 删除字符串的第一个和最后一个部分 - 像函数一样爆炸?

algorithm - Dijkstra算法中的三角不等式和路径松弛有什么区别?

algorithm - 按顺序查找数组中最大的 10% 的数字

design-patterns - 异步观察者模式

java - 在java中从字符串[{"server_result":"101"}]中提取数字

c - C 中指针前进并在 strchr 之后再获取 2 个字符