示例数据: 输入:“abcdacdc” 输出:“cadb” 在这里,我们必须按字符数排序字符串。 如果字符的计数相同。保持原来的顺序 输入字符串中的字符。
我的方法:我使用了26的数组来维护所有字符的出现并对其进行排序然后打印出来。但是这样做的话,如果两个字符具有相同的计数,我就无法保持顺序。
请建议任何改进或任何其他算法。
答案 0 :(得分:2)
例如在c#中使用哪种语言,您可以简单地执行以下操作:
var strstr = "abcdacdc";
var sortedString = new string(strstr
.OrderByDescending(x => strstr.Count(p=>p==x))
.Distinct().ToArray());
算法很明显(在for循环中你也可以这样做)。
编辑:首先我们按照计数对字符串的所有字符进行排序,之后我们将使用没有重复项目的字符(Distinct方法)。
private struct CharCount
{
public int count;
public char ch;
}
List<CharCount> sortedChars = new List<CharCount>();
for(int i=0;i<strstr.Length;i++)
{
if (sortedChars.FindIndex(x => x.ch == strstr[i]) < 0)
{
int charcount = GetCharCount(strstr, strstr[i]);
sortedChars.Add(new CharCount {count = charcount, ch = strstr[i]});
}
}
string sortedstr2 = new string(sortedChars.OrderByDescending(x => x.count).Select(x=>x.ch).ToArray());
你可以像你的方式一样实现GetCharCount
方法,26个字符的数组和......,所以首先用于循环的上述算法是O(n ^ 2),最后一个段落(排序)是O(n log( n))总共为O(n ^ 2)。您可以根据需要(按您的特定语言)更改最后一段。