为了账号安全,请及时绑定邮箱和手机立即绑定

返回第一个最长的字符串,由c#中数组中取的n个连续字符串组成

返回第一个最长的字符串,由c#中数组中取的n个连续字符串组成

C#
红颜莎娜 2021-09-19 16:07:13
我在面试中遇到了这个问题:我得到了一个字符串数组 strarr 和一个整数 k。我的任务是返回由数组中的 k 个连续字符串组成的第一个最长字符串。规则:n 为字符串数组的长度,如果 n = 0 或 k > n 或 k <= 0 返回“”。例子:LongestConsec(["zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"], 2) 输出应该是“abigailtheta”下面是我试过的代码..它不工作。public class LongestConsecutives{    public static String LongestConsec(string[] strarr, int k)    {        string final = String.Join("", strarr.OrderByDescending(s=>s.Length).Take(k));         return final;    }    public static void Main()    {        string s1 = LongestConsec(new String[] { "wlwsasphmxx", "owiaxujylentrklctozmymu", "wpgozvxxiu" }, 2); //op="wlwsasphmxxowiaxujylentrklctozmymu"        string s2 = LongestConsec(new string[] { "itvayloxrp", "wkppqsztdkmvcuwvereiupccauycnjutlv", "vweqilsfytihvrzlaodfixoyxvyuyvgpck" }, 2);//op="wkppqsztdkmvcuwvereiupccauycnjutlvvweqilsfytihvrzlaodfixoyxvyuyvgpck"        string s3 = LongestConsec(new String[] { "zone", "abigail", "theta", "form", "libe", "zas" }, -2);//op=""        string s4 = LongestConsec(new String[] { "it", "wkppv", "ixoyx", "3452", "zzzzzzzzzzzz" }, 3);//op="ixoyx3452zzzzzzzzzzzz"        string s5 = LongestConsec(new String[] { "it", "wkppv", "ixoyx", "3452", "zzzzzzzzzzzz" }, 15);//op=""        string s6 = LongestConsec(new String[] { "it", "wkppv", "ixoyx", "3452", "zzzzzzzzzzzz" }, 0);//op=""        string s7 = LongestConsec(new String[] { }, 3);//op=""        string s8 = LongestConsec(new String[] { "zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail" }, 2);//op="abigailtheta"        string s9 = LongestConsec(new String[] { "ejjjjmmtthh", "zxxuueeg", "aanlljrrrxx", "dqqqaaabbb", "oocccffuucccjjjkkkjyyyeehh" }, 1);//op="oocccffuucccjjjkkkjyyyeehh"    }}
查看完整描述

2 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

您.Distinct()在 LINQ 中缺少删除重复项的调用。


public static String LongestConsec(string[] strarr, int k)

{

    string final = String.Join("", 

        strarr.Distinct()                       // Remove Duplicates

              .OrderByDescending(s => s.Length) // Order by Length

              .Take(k)                          // Take from List

    );


    return final;

在此修改后,您将获得预期的输出:


string target = LongestConsec(new string[] { "zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"}, 2);

// target = "abigailtheta"

但是您仍然缺少IF完成您描述的规则的案例:


如果 n = 0 或 k > n 或 k <= 0 返回“”


更新

正如 Vladimir Pavelka 在评论中指出的那样,您只需要一种方法来存储词序的初始索引。你可以用这样的Dictionary东西来做到这一点:


public static String LongestConsec(string[] strarr, int k)

{

    var dict = new Dictionary<string, int>();

    for (int i = 0; i < strarr.Length; i++)

    {

        if (!dict.ContainsKey(strarr[i]))  // Preventing duplicates

        {

            dict.Add(strarr[i], i + 1);

        }

    }


    string final = String.Join("",

        dict.OrderByDescending(s => s.Key.Length)

            .Take(k)

            .OrderBy(s => s.Value)

            .Select(s => s.Key)

    );


    return final;

}


查看完整回答
反对 回复 2021-09-19
?
BIG阳

TA贡献1859条经验 获得超6个赞

与 Smartis 讨论后:


public static String LongestConsec(string[] strarr, int k) =>

    String.Join("", 

        strarr.Distinct() // note: this won't change order

              .Select((s, idx) => (s, idx)) // store initial index

              .OrderByDescending(x => x.s.Length) // longest words first

              .Take(k)

              .OrderBy(x => x.idx) // restore original order

              .Select(x => x.s));


查看完整回答
反对 回复 2021-09-19
  • 2 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信