我陷入了這個邏輯,我不知道如何解決它,我有以下問題:
“給定一個大小為 n 的 nums 陣列,回傳多數元素,即在陣列中出現次數最多的元素。”
我有這個代碼庫:
`using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main(String[] args)
{
int n = int.Parse(Console.ReadLine());
int[] num = new int[n];
for (int i = 0; i < n; i )
{
num[i] = int.Parse(Console.ReadLine());
}
Console.WriteLine(MajorityElement(num));
}
public static int MajorityElement(int[] nums)
{
int major = nums[0];
int count = 1;
for (int i = 0; i < nums.Length; i )
{
if ( )
{
major = nums[i];
count ;
}
else
{
if (major == nums[i])
{
count ;
}
else
{
count--;
}
}
}
return major;
}
}`
但我想不出第一個 IF 的邏輯是什么。
這個問題的邏輯如何?我將如何解決它?
uj5u.com熱心網友回復:
解決此問題的一種簡潔但低效的方法如下:
int major = nums.ToLookup(n => n).MaxBy(item => item.Count()).Key;
這是如何運作的?
nums.ToLookup(n => n)
這用于Enumerable.ToLookup()創建查找表。查找表將為陣列中的每個唯一編號包含一個條目。每個條目將包含一個鍵(即數字)和具有相同值的所有數字的串列。
該n => n部件從每個值中選擇查找鍵。在這種情況下,它們是相同的,但通常它會用于從您正在為其創建查找的類中選擇一些屬性。
也就是說,給定這個串列(數字可以是任何順序):
int[] nums = { 1, 2, 2, 3, 3, 3 };
然后查找表將有 3 個元素(串列中的每個唯一數字一個),如下所示:
[1] = {1}
[2] = {2, 2}
[3] = {3, 3, 3}
請注意,方括號中的數字不是索引 - 它們是鍵。它們不必是整數;例如,它們可以是字串。
我想你已經能夠看到這真的是多么低效!我們不應該僅僅為了獲得它們的計數而存盤所有匹配數字的串列。盡管如此,讓我們繼續解釋。
.MaxBy(item => item.Count())
這會根據每個元素選擇查找表的最大元素,即每個元素的item.Count()所有專案的計數。在上面的示例中,您可以看到 [1] 的計數為 1,[2] 的計數為 2,[3] 的計數為 3。
.Key
一旦我們根據計數選擇了查找表中的最大元素,我們只需訪問該元素的鍵。請記住,查找表的鍵是我們計算過的整數。因此,具有最多專案的元素的鍵是我們正在尋找的數字。
一種更有效的方法:使用Dictionary<Tkey, TValue>
我們可以使用字典來計算唯一項的數量。字典鍵將是串列中唯一的整數值,每個鍵的字典值將是該鍵的出現次數。
var dict = new Dictionary<int, int>();
foreach (int value in nums)
{
if (dict.ContainsKey(value))
dict[value];
else
dict[value] = 1;
}
int major = dict.MaxBy(kvp => kvp.Value).Key;
這更容易理解。它遍歷輸入中的每個數字,如果它不在字典中,則將值 1 添加到字典中。(這當然是初始計數。)如果該數字已經在字典中,則它會增加該值 - 即它會增加該數字的出現次數。
最后,代碼選擇具有最高值(即最高重復計數)的字典元素并選擇該值的鍵(將是重復多次的數字)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/525085.html
標籤:C#网。网
