当前位置: 首页 > 知识库问答 >
问题:

在数组中分散重复

和和裕
2023-03-14

来源:谷歌面试问题

编写一个例程,以确保输入中的相同元素在输出中的分布最大?

基本上,我们需要以这样一种方式放置相同的元素,使总传播尽可能最大化。

示例:

Input: {1,1,2,3,2,3}

Possible Output: {1,2,3,1,2,3}  

Total dispersion = Difference between position of 1's + 2's + 3's = 4-1 + 5-2 + 6-3 = 9 .

我一点也不确定,是否有一个最佳多项式时间算法可用于此。此外,除此之外,没有为问题提供其他细节。

我的想法是,计算输入中每个元素的频率,然后将它们排列在输出中,每次排列每个不同的元素,直到所有频率都用完。

我不确定我的方法。

任何方法/想法的人。

共有3个答案

酆耀
2023-03-14

Vorspring和HugoRune建议的算法的python代码:

from collections import Counter, defaultdict

def max_spread(data):
    cnt = Counter()
    for i in data: cnt[i] += 1

    res, num  = [], list(cnt)
    while len(cnt) > 0:
        for i in num:
            if num[i] > 0:
                res.append(i)
                cnt[i] -= 1
            if cnt[i] == 0: del cnt[i]

    return res

def calc_spread(data):
    d = defaultdict()
    for i, v in enumerate(data):
        d.setdefault(v, []).append(i)

    return sum([max(x) - min(x) for _, x in d.items()])
卫宏硕
2023-03-14

在perl中

@a=(9,9,9,2,2,2,1,1,1);

然后制作一个列表中不同数字计数的哈希表,就像频率表一样

map { $x{$_}++ } @a;

然后重复遍历所有找到的键,键以已知的顺序,并将适当数量的单个数字添加到输出列表中,直到所有键都耗尽

@r=();
$g=1; 
while( $g == 1 ) { 
   $g=0;
   for my $n (sort keys %x) 
      {
      if ($x{$n}>1) {
                    push @r, $n;
                    $x{$n}--;
                    $g=1
                    }
      } 
}

我确信这可以适用于任何支持哈希表的编程语言

蒋正平
2023-03-14

我相信这个简单的算法会奏效:

  • 计算每个不同元素的出现次数
  • 将多次出现的所有元素的一个实例添加到列表中(每组中的顺序无关紧要)
  • 将所有唯一元素的一个实例添加到列表中
  • 将多次出现的所有元素的一个实例添加到列表中
  • 将出现两次以上的所有元素的一个实例添加到列表中
  • 将出现三次以上的所有元素的一个实例添加到列表中

现在,直觉上这不会给出一个好的传播:
对于{1,1,1,2,3,4}==

然而,我认为这是最好的传播,你可以得到的评分函数提供。由于离散度分数计算的是距离之和,而不是距离的平方和,因此,只要在其他地方有较大的差距需要补偿,就可以有多个副本靠近。

对于距离平方和分数,问题变得更加困难。也许面试问题取决于应聘者是否认识到评分函数中的这一弱点?

 类似资料:
  • 问题内容: 我正准备编写一个基于MPI的代码,以便使用python和MPI4py进行一些计算。但是,按照该示例,我无法将一个numpy向量散布到核心中。这是代码和错误,有人可以帮助我吗?谢谢。 错误结果是: 谢谢。 问题答案: 数据类型不正确。我应该指定数组的类型:

  • 如何在两个属性之后对对象数组进行分组?在以下情况下是否可以使用减少? 例如:按国家和城市将以下数组分组,并对“年龄”属性求和: /*预期结果:*/

  • 问题内容: 现在有很多类似的问题,但是大多数回答了如何删除重复的列。但是,我想知道如何制作一个元组列表,其中每个元组都包含重复列的列名。我假设每一列都有一个唯一的名称。为了进一步说明我的问题: 然后我想要输出: 如果今天您感觉很好,则将相同的问题扩展到行。如何获取元组列表,其中每个元组都包含重复的行。 问题答案: 这是NumPy的一种方法- 样品运行- 进行转换即可,但是对于rows(index)

  • 问题内容: 可以散列吗? 例如,我知道元组的散列是可能的: 但是可以对a进行哈希处理吗? 可能的解决方案: 这里是对列表哈希的非常深入的解释。 问题答案: 就试一试吧: 所以,你可以得到的,并因为是不可变的,你不能做到这一点,并因为他们是可变的。

  • 问题内容: 我想显示一些观点。这是我的代码: 和我一样: 所以我有两种不同颜色的点。但是我也想有两个不同的标记。我该怎么做?给出一个错误。 问题答案: 每个标记可以使用一个散点图。

  • 在SDA中输入std代码时,我输入了带有零的std代码,但为什么零不在显示数组时的值中?