【问题标题】:Given sums of the first and last rows and the sums of all columns in a Nx2 matrix ,find the value of each cell in matrix (C++)给定 Nx2 矩阵中第一行和最后一行的总和以及所有列的总和,找到矩阵中每个单元格的值(C++)
【发布时间】:2020-10-14 09:27:49
【问题描述】:

我目前正在准备面试考试(试图找到我的第一份工作)。 我很难找到这个问题的算法。我很想得到一些帮助:

给定第一行和最后一行的总和以及一个包含 Nx2 矩阵中所有列总和的数组,求矩阵中每个单元格的值,其中每个单元格为 0 或 1。

提前致谢!

【问题讨论】:

  • 这不是关于编程的问题。它相当一个谜。先用纸笔解决,再写代码应该是小菜一碟
  • 要么我错过了什么,要么有独特解决方案的情况很少见。您需要找到一种解决方案还是独特的解决方案?
  • 顺便说一句,根据我有限的面试经验,我想说他们想看看你如何解决问题,他们不希望你知道解决方案。希望看到您可以开发解决方案而不是测试您是否可以记住解决方案
  • 一个朴素的算法将是递归的,假设有一个解决方案,随机选择和条件检查。您遍历第 n 列的两个单元格的所有可能组合,如果没有通过行总和检查(当前总和高于预期总和),则返回一列以测试下一个组合的 n-1 列。否则,使用第 n 列传递的第一个组合移动到 n+1。如果存在,这只会找到一种解决方案
  • 等等,你确定矩阵不是 2xN(2 行,N 列)吗?

标签: c++ matrix


【解决方案1】:

我假设要重新创建的矩阵是 2xN 而不是 Nx2。然后,您就有了找到问题答案所需的全部金额。

一个朴素的算法将是递归的,具有随机选择和条件检查。您遍历第 n 列的两个单元格的所有可能组合,如果没有通过行总和检查(当前总和高于预期总和),则返回一列以测试 n-1 列的下一个组合。否则,使用第 n 列传递的第一个组合移动到 n+1。如果存在,这只会找到一种解决方案

在伪代码中,递归方法如下所示:

def find_combination_for_column(n):
  if n > max_n return 0
  for each x, y in possible_combination(n)
    if n == max_n and curr_sum_1 + x == expected_1 and curr_sum_2 + y == expected_2
      // result foud here, print and exit
      print(x, y)
      return 1
    if curr_sum_1 + x > expected_1 or curr_sum_2 + y > expected_2
      // go back to previous column
      return 0
    if find_combination_for_column(n + 1)
      // result already found, all that's left is to print this column's parameters and continue exiting
      print(x, y)
      return 1
    // else go to next combination

编辑

没有看到 0 和 1 唯一可能的值。这种幼稚的方法应该仍然有效,但您将能够跳过总和为 0 或 2 的列,因为只有一种组合是可能的。

【讨论】:

    【解决方案2】:

    答案是不可能的:让我用下面的例子来证明这一点:找到一个 4x4 矩阵,其中每个单元格的值为 0 或 1,并且每行和每列的总和等于 2。有以下解决方案:

    1 0 1 0
    0 1 0 1
    1 0 1 0
    0 1 0 1
    
    0 1 0 1
    1 0 1 0
    0 1 0 1
    1 0 1 0
    
    1 1 0 0
    1 1 0 0
    0 0 1 1
    0 0 1 1
    
    0 0 1 1
    0 0 1 1
    1 1 0 0
    1 1 0 0
    
    1 0 0 1
    0 1 1 0
    0 1 1 0
    1 0 0 1
    
    ... (there are lots and lots of solutions)
    

    我相信这次采访的真正问题是:你能确定一个问题是无法解决的吗?

    【讨论】:

    • 虽然使用此设置可能有很多解决方案仍然是正确的,但他指定矩阵为 Nx2。
    • N 行 2 列。好的,但这仍然无法解决问题。
    • 您的观点是正确的,可能没有或有多种解决方案。但是,在存在的情况下,您仍然可以找到一种或多种解决方案;或者说在另一种情况下不存在解决方案。
    • @gdelab:我确实理解你的意思,但我会是面试官问这个问题并且那个人想出了一个算法(经过相当长的一段时间),我会回答“你有没有考虑过这个问题可能无解?”我会因为没有检测到这一点而让候选人不及格。但是,如果候选人回答“先生,您问我一个甚至可能没有解决方案的问题。”,我很乐意将问题修改为可解决的问题,我会为此向候选人表示祝贺头脑敏锐。
    • 你把头脑的敏锐度称为这里所有参与者的假设。您的答案是“没有可能的答案”,但是您想出了大量可以解决问题的解决方案。实际上,我认为这类问题的重点是向面试官展示解决问题的能力和编码技巧。我敢肯定地指出,可能有多种解决方案非常好,但充其量只是一个奖励。
    【解决方案3】:

    我假设您有 N 行和 2 列,以及每行和列的总和。

    不需要回溯,在线性时间内找到解决方案是可行的(实际上通常有不止一个解决方案)。如果有解决方案,你会找到的。否则,您可以确定。

    在伪代码中:

    rows_with_choice = []
    sum_so_far = 0
    # Fill all rows for which there is no choice
    for i in range(N):
      # If the sum is 0, each element is 0. If the sum is 2, they are both 1.
      if sum_row(i) in [0; 2] : 
        M[i][0] = sum_row(i) / 2
        M[i][1] = sum_row(i) / 2
        sum_so_far += sum_row(i)
      else:
        rows_with_choice.append(i)   # These are the indices of the rows that contain either (0; 1) or (1; 0)
    already_in_each_col = sum_so_far / 2  # Each column already has that number of 1s.
    if already_in_each_col > min(sum_col):
      print('No solution exists')
      return
    if len(rows_with_choice) + sum_so_far != sum_col[0] + sum_col[1]:
      print('No solution exists')
      return
    # Among the rows that have a choice, fill the correct amount as (1; 0) and the rest as (0; 1)
    for j in range(sum_col(0) - already_in_each_col):
      i = rows_with_choice[j]
      M[i][0] = 1
      M[i][1] = 0
    for j in range(sum_col(1) - already_in_each_col):
      i = rows_with_choice[j + sum_col(0) - already_in_each_col] 
      M[i][0] = 0
      M[i][1] = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      相关资源
      最近更新 更多