Два Leetcode Сумму


Глядя на некоторые отзывы на две суммы LeetCode проблема. Ищу отзывы о стиле кода в целом, использование VAR, именования переменных и инициализации, возвращаемся размещения, и какие-либо другие отзывы или оптимизации я могу сделать.

Проблема

Дан массив целых чисел, индексы доходности двух чисел таких, что они складываются в определенную цель.

Можно предположить, что каждый вход будет иметь ровно одно решение, и вы можете не использовать дважды один и тот же элемент.

Example:
Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

Мое решение

using System.Collections.Generic;

public class Solution {
    public int[] TwoSum(int[] nums, int target) {
        var numsDictionary = new Dictionary<int, int>();

        int complement = 0;
        for(int i=0; i < nums.Count(); i++) 
        {            
            complement = target - nums[i];
            int index = 0;
            if(numsDictionary.TryGetValue(complement, out index))
            {
                int[] twoSumSolution = {index, i};
                return twoSumSolution;
            }                                                         

            if(!numsDictionary.ContainsKey(nums[i]))
            {
                numsDictionary.Add(nums[i], i);
            }            
        }

        return null;
    }
}


Комментарии
3 ответа


  • Большинство C# - разработчиков будет место открывающие фигурные скобки на новой строке. Если ты это сделаешь так же, то вы сделать его легче читать код других.

  • complement и index следует использовать var "типа", а также

  • twoSumSolution не действительно необходимо, и только добавляет шума в код.

  • Мне нравится использовать if (bool == false) вместо if (!bool) потому что я могу понять это на первый взгляд не интересно, если я вижу восклицательный знак или нет.

  • Вместо использования Count() расширение метод, который я использую Length собственность для массивов. Используя Count() будет envolve мягкий заброс в ICollection<T> и null проверьте, какие просто не нужны.

  • проверка complement > 0 удалит ненужные звонки TryGetValue(), но оказывает влияние на определенные входы, как target = 0 и массив [-3, 7, 3].

Реализация указанных пунктов приведет к

public int[] TwoSum(int[] nums, int target)
{
var numsDictionary = new Dictionary<int, int>();

var complement = 0;
for (var i = 0; i < nums.Length; i++)
{
complement = target - nums[i];
var index = 0;
if (complement > 0 && numsDictionary.TryGetValue(complement, out index))
{
return new int[] { index, i };
}

if (numsDictionary.ContainsKey(nums[i]) == false)
{
numsDictionary.Add(nums[i], i);
}
}

return null;
}

10
ответ дан 20 марта 2018 в 06:03 Источник Поделиться

Некоторые незначительные моменты:

1) Вы действительно не нужны complement переменной, так просто делать математику в вызове TryGetValue().

2) если int[] nums все положительное можно continue цикл, если nums[i] > target.

3) утверждается, что существует только одно решение на вход, так что вы можете пропустить проверку if (!numsDictionary.ContainsKey(nums[i])). Это никогда не будет верно и для чисел, которые добавляют к намеченной цели. Что касается остальных нумс, это не важно.


Все это может быть сведено к этому (для C# 7.0):

public int[] TwoSumReview(int[] nums, int target)
{
Dictionary<int, int> numsDictionary = new Dictionary<int, int>();

for (int i = 0; i < nums.Length; i++)
{
int num = nums[i];

// You can uncomment this if nums are all positive
//if (num > target) { continue; }

if (numsDictionary.TryGetValue(target - num, out int index))
{
return new [] { index, i };
}

numsDictionary[num] = i;
}

return null;
}

5
ответ дан 20 марта 2018 в 08:03 Источник Поделиться

Словарь может быть инициализирован для начальной емкости
Нет цели index = 0

public static int[] TwoSum(int[] nums, int target)
{
int numsLength = nums.Length;
if(numsLength <= 1)
{
return null;
}
Dictionary<int, int> numsDictionary = new Dictionary<int, int>(numsLength);
int complement;
int index;
int num;
numsDictionary.Add(nums[0], 0);
for (int i = 1; i < numsLength; i++)
{
num = nums[i];
complement = target - num;
if (numsDictionary.TryGetValue(complement, out index))
{
return new int[] { index, i };
}
if (!numsDictionary.ContainsKey(num))
{
numsDictionary.Add(num, i);
}
}
return null;
}

1
ответ дан 20 марта 2018 в 08:03 Источник Поделиться