首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接受字符串作为输入并返回字符串数组的函数ABC(abcde)应返回[Abcde,aBcde,abCde,abcDe,abcdE]

接受字符串作为输入并返回字符串数组的函数ABC(abcde)应返回[Abcde,aBcde,abCde,abcDe,abcdE]
EN

Stack Overflow用户
提问于 2018-07-30 02:35:58
回答 4查看 196关注 0票数 0

我这样做,但它删除字符串之前的字符,它的输出是(魔术,Agic,Gic,Ic,C),但我希望整个字符串是前后连接。

代码语言:javascript
复制
      public string[] Transform(string st)
 {
     string[] arr = new string[st.Length];

     string[] arr1 = new string[st.Length];
     for (int x = 0; x < st.Length; x++)
     {
         arr1[x] = char.ToLower(st[x]) + "".ToString();
     }
     for (int i = 0; i < st.Length; i++)
     {
         string st1 = "";
         {
             st1 = char.ToUpper(st[i]) + st.Substring(i + 1);
         }
         arr[i] = st1; 
     }
         return arr; 

 }
EN

回答 4

Stack Overflow用户

发布于 2018-07-30 02:48:28

你忘了添加字符串的左边部分。试着这样做:

st1 = st.ToLower().Substring + char.ToUpper(sti) + st.Substring(i + 1);

票数 0
EN

Stack Overflow用户

发布于 2018-07-30 04:13:13

  1. 我为你的问题写了一个答案(这是第二个代码片段),你可以根据需要修改它,比如将返回类型改为string[],或者如果你想坚持使用它,可以使用ToArray()扩展方法。我认为这样更具可读性。

我决定放一个小分析器来检查CPU和内存的使用情况,并与@Ron Beyer的答案进行比较。

这是我的第一次尝试:

代码语言:javascript
复制
    public static void Main()
    {
        var result = Transform("abcde");
        result.ToList().ForEach(WriteLine);
    }

    public static IEnumerable<string> Transform(string str)
    {
        foreach (var w in str)
        {
            var split = str.Split(w);

            yield return  split[0] + char.ToUpper(w) + split[1];
        }
    }

结果:

代码语言:javascript
复制
    Abcde
    aBcde
    abCde
    abcDe
    abcdE

代码小提琴

上面的代码有一个很大的缺点,只有当传递的单词有唯一的字母时,它才能工作。因此,"aaaaa“不会产生正确的结果。

  1. 这里是我的第二次成功尝试,它似乎适用于任何字符串输入。我使用了一个StringBuilder实例来减少需要在一个实例上创建和管理的对象的数量,而不是复制如此多的对象以使其更优化。

public static void Main() { var IEnumerable = Transform("aaaaa");.ForEach().ForEach(WriteLine);} public static IEnumerable Transform(string str) { var result = new StringBuilder(str.ToLower());for( int i= 0;i< str.Length;i++) { resulti = char.ToUpper(stri);yield result.ToString();resulti = char.ToLower(stri);}}

结果:

Aaaaa aAaaa aaAaa aaaAa aaaaA

代码纠缠:

  • Measuring执行时间和内存使用。

我将使用dotnetfiddle.net状态面板,以使其更容易。Fiddle有很少的限制,如代码执行时间10秒和使用的内存

此外,差异是非常显着的。我测试了14000次重复的程序,我的代码还将输出更改为array[]。

代码语言:javascript
复制
- My answer ([https://dotnetfiddle.net/1fLVw9](https://dotnetfiddle.net/1fLVw9))

上次运行时间: 12:23:09 pm编译: 0.046s执行: 7.563s内存:16.22 12 CPU: 7.609s

-比较答案(https://dotnetfiddle.net/Zc88F2)

编译: 0.031s执行: 9.953s内存:16.22 CPU: 9.938s

它略微减少了执行时间。希望这能有所帮助!

票数 0
EN

Stack Overflow用户

发布于 2018-07-30 14:44:41

这里。这比使用字符串构建器和列表的方法快两倍

代码语言:javascript
复制
public static string[] Transform(string str)
{
    var strs = new string [str.Length];
    var sb = str.ToCharArray();

    char oldCh;
    for (int i = 0; i < str.Length; i++)
    {
        oldCh = sb[i];
        sb[i] = char.ToUpper(sb[i]);
        strs[i] = new string (sb);
        sb[i] = oldCh;
    }
    return strs;
}

没有必要清除并一直将字符串读到字符串构建器中。我们还知道数组的大小,以便可以在开始时分配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51583377

复制
相关文章

相似问题

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