加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#中两个整数元组的总和

发布时间:2020-12-16 00:26:01 所属栏目:百科 来源:网络整理
导读:我正在努力解决这个问题,就像准备面试一样: 编写一个函数,给定一个列表和一个目标和,返回任何两个不同元素的从零开始的索引,这两个元素的总和等于目标总和.如果没有这样的元素,则该函数应返回null. 例如,FindTwoSum(new List(){1,3,5,7,9},12)应该返回以下
我正在努力解决这个问题,就像准备面试一样:
编写一个函数,给定一个列表和一个目标和,返回任何两个不同元素的从零开始的索引,这两个元素的总和等于目标总和.如果没有这样的元素,则该函数应返回null.

例如,FindTwoSum(new List(){1,3,5,7,9},12)应该返回以下任何索引元组:

1,4(3 9 = 12)

2,3(5 7 = 12)

3,2(7 5 = 12)

4,1(9 3 = 12)

这是我到目前为止所做的

public static Tuple<int,int> FindTwoSum(List<int> list,int sum)
    {
        List<Tuple<int,int>> ListOfInt = new List<Tuple<int,int>>();
        for (int i=0; i<list.Count; i++)
        {
            for(int j=0; j<list.Count; j++)
            {
                if (list[i] + list[j] == sum)
                {
                    ListOfInt.Add(new Tuple<int,int>(i,j));
                }
            }
        }

        foreach ( var elemt in ListOfInt)
        {
            return elemt;
        }
        return null;

    }

问题是找到所有结果并保存在元组中:但我仍然无法将结果打印到控制台.我认为foreach的陈述有些不对劲.
在我编写的主要方法中,将结果打印到控制台:

Console.WriteLine(FindTwoSum(new List<int>() { 1,9 },12));

请问任何建议:)?

解决方法

好吧,如果b = sum然后b a = sum,那么你可以切割内环并立即返回两对;您当前实现的另一个问题和反例是a = sum不计算,例如

{3,6,12

应该只返回

0,2 // 3 + 9
  2,0 // 9 + 3

并不是

1,1 // 6 + 6 is wrong

我宁愿实现返回IEnumerable< Tuple< int,int>>的解决方案:

// Are you given List<int>? What about int[]? IEnumerable<int> is a much better choice 
  public static IEnumerable<Tuple<int,int>> FindTwoSum(IEnumerable<int> items,int sum) {
    // Validate Arguments (the method is public one!)
    if (null == items)
      throw new ArgumentNullException("items");

    var list = items.ToList();

    for (int i = 0; i < list.Count - 1; ++i)   // last line doesn't count
      for (int j = i + 1; j < list.Count; ++j) // note j = i + 1
        // if ((list[i] + list[j] == sum) && (list[i] != list[j])) { // distinct values and indexes
        if (list[i] + list[j] == sum) { // distinct indexes only
          yield return new Tuple<int,j);
          yield return new Tuple<int,int>(j,i);                
        }
  }

如果你想要不同的值以及不同的索引而不是

if (list[i] + list[j] == sum)

应该

if ((list[i] + list[j] == sum) && (list[i] != list[j]))

不同的值,但不是索引不是一种情况,因为a [i] == a [i]所以只要索引不区分值.我们有条件

if ((list[i] + list[j] == sum) && (list[i] != list[j]))

测试:

// note that I can pass an array (int[]) or list (List<int>) whatever collection
  String report = String.Join(Environment.NewLine,FindTwoSum(new int[] { 1,12));

  // (1,4)
  // (4,1)
  // (2,3)
  // (3,2)
  Console.Write(report);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读