你会如何解决朱莉娅的换信者?

时间:2018-04-17 14:28:50

标签: string julia

我发现了这个挑战:

使用您的语言,使用函数LetterChanges(str)获取传递的str参数并使用以下算法对其进行修改。将字符串中的每个字母替换为字母表后面的字母(即c变为d,z变为a)。然后大写这个新字符串(a,e,i,o,u)中的每个元音,最后返回这个修改后的字符串。

我是朱莉娅的新人,我在挑战中挑战自我。我在Julia lang中发现了这个挑战,我找不到解决方案。

这里我尝试以下面的方式解决,但是我得到了错误:x值未定义

你会如何解决这个问题?

function LetterChanges(stringis::AbstractString)

alphabet = "abcdefghijklmnopqrstuvwxyz"

vohels = "aeiou"

for Char(x) in split(stringis, "")
    if x == 'z'
        x = 'a'
    elseif x in vohels
        uppercase(x)
        else 
        Int(x)+1
        Char(x)
        println(x)
    end
end
end

谢谢

4 个答案:

答案 0 :(得分:2)

存在逻辑错误。它说“将字母表中的每个字母替换为字母表后面的字母。然后将这个新字符串中的每个元音大写”。您的代码检查,如果它是元音。然后它将其大写或替换它。这是不同的行为。您必须先替换然后检查它是否是元音。

您正在将'a'替换为'Z'。你应该用'a'替换'z'

函数split(stringis, "")返回一个字符串数组。您无法将这些字符串存储在Char(x)中。您必须将它们存储在x中,然后您可以使用c = x[1]将这些字符串转换为char。

转换字符后,您必须将其存储在变量c = uppercase(c)

您不需要将char转换为int。您可以向字符添加数字:c = c + 1

您必须将新字符存储在字符串中并将其返回。

function LetterChanges(stringis::AbstractString)

    # some code

    str = ""
    for x in split(stringis, "")
        c = x[1]

        # logic

        str = "$str$c"
    end
    return str
end

答案 1 :(得分:2)

作为旁注: 建议的解决方案正常工作。但是,如果您需要高性能(可能没有给出问题的根源),使用字符串构建器会更有效:

function LetterChanges2(str::AbstractString)
    v = Set("aeiou")
    #sprint(sizehint=sizeof(str)) do io # use on Julia 0.7 - new keyword argument
    sprint() do io # use on Julia 0.6.2
        for c in str
            c = c == 'z' ? 'a' : c+1 # we assume that we got only letters from 'a':'z'
            print(io, c in v ? uppercase(c) : c)
        end
    end
end

它比上面快了10倍。

编辑:对于Julia 0.7来说这有点快:

function LetterChanges2(str::AbstractString)
    v = BitSet(collect(Int,"aeiouy"))
    sprint(sizehint=sizeof(str)) do io # use on Julia 0.7 - new keyword argument
        for c in str
            c = c == 'z' ? 'a' : c+1 # we assume that we got only letters from 'a':'z'
            write(io, Int(c) in v ? uppercase(c) : c)
        end
    end
end

答案 2 :(得分:2)

这里的另一个版本比@ BogumilKaminski在版本0.6上的回答快一点,但在0.7上可能会有所不同。另一方面,它可能比public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { onBackPressed(); return true; } else { return super.onOptionsItemSelected(item); } } - 块魔法少一点吓人;)

do

答案 3 :(得分:1)

冒着被指控作弊的风险,这是一种基于字典的方法:

'a'=>'b'

对于长字符串(例如100,000个字符),似乎在速度方面与其他Julia 0.6方法相比较。在构造字典时有一些不必要的开销,这在小字符串上是显而易见的,但是我太懒了,不能长时间地输入Depends: cubature (>= 1.3-11)构造!