Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将数字替换为列表中其他数字的总和,不进行减法运算_Arrays_Algorithm_Language Agnostic_Puzzle - Fatal编程技术网

Arrays 将数字替换为列表中其他数字的总和,不进行减法运算

Arrays 将数字替换为列表中其他数字的总和,不进行减法运算,arrays,algorithm,language-agnostic,puzzle,Arrays,Algorithm,Language Agnostic,Puzzle,有人问我: 将列表中的每个数字替换为剩余元素的总和,则列表不会排序。 所以假设我们有一个像{2,7,1,3,8}这样的数字列表,现在我们要用其余元素的和来替换每个元素。输出应为: {(7 + 1 + 3 + 8), (2 + 1 + 3 + 8), (2 + 7 + 3 + 8), (2 + 7 + 1 + 8), (2 + 7 + 1 + 3)} == {19, 14, 20, 18, 13} 我回答了一个显而易见的解决方案: 首先计算所有数字的sum,然后从sum中减去每个元素。

有人问我:

将列表中的每个数字替换为剩余元素的总和,则列表不会排序。
所以假设我们有一个像
{2,7,1,3,8}
这样的数字列表,现在我们要用其余元素的和来替换每个元素。输出应为:

    {(7 + 1 + 3 + 8), (2 + 1 + 3 + 8), (2 + 7 + 3 + 8), (2 + 7 + 1 + 8), (2 + 7 + 1 + 3)}
==  {19, 14, 20, 18, 13}
我回答了一个显而易见的解决方案:
首先计算所有数字的
sum
,然后从
sum
中减去每个元素。 因此,对于上面的列表,
sum
2+7+1+3+8
=
21
,然后对于输出,执行如下操作:

    {sum - 2, sum - 7, sum - 1, sum - 3, sum - 8}
    {21 - 2, 21 - 7, 21 - 1, 21 - 3, 21 - 8}
==  {19, 14, 20, 18, 13}
它只需要列表的两次迭代

然后面试官问我:现在不做减法了吗?我无法回答:(

其他的解决方案可能吗?一些人可以分享其他的技巧吗?一个更好的技巧是可能的


允许使用额外的内存空间(我在几分钟的尝试后询问,即使当时我无法回答)。

解决方案是对元素以外的所有元素求和。然后不必在事实发生后进行减法。只需跳过在当前索引处添加元素即可


或者,您可以获得列表的子集,该子集不包括当前索引中的元素,然后将子集相加。这与我的第一个建议基本相同,但有更多的实现细节。

一种可能性是计算数组的前缀和后缀之和,然后合并适当的条目。这是uld仍然是O(n),但需要更多的内存空间,所以我认为您原来的方法更好


换句话说,从{2,7,1,3,8}计算{2,2+7,2+7+1,2+7+1+3,2+7+1+3+8}和{2+7+1+3+8,7+1+3+8,1+3+8,3+8,3+8}然后添加适当的条目。

您可以将元素乘以-1,而不是减去元素。我想乘法和加法都是允许的运算。

我想没有比您的更好的了

但这个呢:

创建一个
(n-1)xn
矩阵:

[ 2, 7, 1, 3, 8 ]

| 7, 1, 3, 8, 2 |  rotate by 1
| 1, 3, 8, 2, 7 |         by 2
| 3, 8, 2, 7, 1 |         by 3
| 8, 2, 7, 1, 3 |         by 4
然后对各栏进行总结

C++的
std::rotate\u copy
可用于创建矩阵

  std::vector<int> v1 {2, 7, 1, 3, 8 };
  std::vector<int> v2 (v1.size());
  int i,j;

  std::vector< std::vector<int> > mat;  
  for (int i=1; i<v1.size();++i){
     std::rotate_copy(v1.begin(),v1.begin()+i,v1.end(),v2.begin());
     mat.push_back(v2);
    }                                            

  for(j=0;j<v1.size();++j)  
    for(i=0;i<v1.size()-2;++i)
       v2[j]+=mat[i][j];

 for(i=0;i<v2.size();++i)
  std::cout<<v2[i]<<" ";
std::向量v1{2,7,1,3,8};
std::vector v2(v1.size());
int i,j;
std::vectormat;
对于(inti=1;iC++实现.O(n),通过在某个索引前后保持所有元素的总和来完成

#include <iostream>

int main() {
    int a[] = {2,7,1,3,8};

    int prefix[5]; // Sum of all values before current index
    int suffix[5]; // Sum of all values after current index

    prefix[0] = 0; 
    suffix[4] = 0; 

    for(int i = 1; i < 5; i++) {
        prefix[i] = prefix[i-1] + a[i-1];
        suffix[4 - i] = suffix[4 - i + 1] + a[4 - i + 1]; 
    }   

    // Print result
    for (int i = 0; i < 5; i++) {
        std::cout << prefix[i] + suffix[i] << " ";
    }   
    std::cout << std::endl;
}
#包括
int main(){
int a[]={2,7,1,3,8};
int前缀[5];//当前索引之前所有值的总和
int后缀[5];//当前索引后所有值的总和
前缀[0]=0;
后缀[4]=0;
对于(int i=1;i<5;i++){
前缀[i]=前缀[i-1]+a[i-1];
后缀[4-i]=后缀[4-i+1]+a[4-i+1];
}   
//打印结果
对于(int i=0;i<5;i++){
std::cout
#包括
#包括
int main(){
int a[]={2,7,1,3,8};
整数和[5]={0};
对于(int j=0;j<5;j++){
对于(int i=1;i<5;i++){
和[j]=和[j]+a[(j+i+5)%5];
}
printf(“%d”,和[j]);}
}

我告诉了他这个,但我觉得这个问题不是答案(太慢了)。@GrijeshChauhan为什么不呢?结果是
O(n^2)
@Teepeemm这是被禁止的吗?我想不是,但鉴于OP和@Peter de Rivaz给出了两个不同的
O(n)
solutions,我认为这不是面试官想要的。正确的想法,错误的答案。你需要排除元素,即第一个数组是{0,2,9,10,13}。然后只需将每个位置的元素添加在一起。我同意,您的方式看起来更优雅。
然后添加适当的条目
您的意思是在两个列表中说A1,A2作为输出,我应该添加
output[I]=A1[I]+A2[N-I]
?请进一步求解。再给我一些时间…你将有两个数组,一个增加,另一个减少:第一个是{0,2,7+2…},另一个是{…,3+8,8,0}。然后你只需在每个位置将两个元素相加即可得到和。在我的方案中,输出[i]=A1[i-1]+A2[i+1]如果0为什么这是一个错误的答案?
sum-a
sum+(-1*a)
给出相同的结果,但不使用减法。@phlogratos Naa phlogratos肯定还有其他解决方案,我一直在考虑每个操作员。例如,阅读其他答案。我试图理解……我很确定面试官会称之为作弊。至少我问这个问题时是这样做的。这是为什么作弊g?让我们假设你必须在硬件中解决这个问题,你没有减法芯片,只有一个乘法器和一个加法器。在这种情况下,你可以解决你的问题。POW这是其他元素的总和,我认为问题(不是答案)内存+迭代都需要更多:(如果时间和空间的复杂性无关紧要,这确实符合不减法的限制条件。
#include <iostream.h>
#include <stdio.h>

int main() {
    int a[] = {2,7,1,3,8};

    int sum[5]={0};


     for(int j = 0; j < 5; j++){
       for(int i = 1; i < 5; i++) {
        sum[j]=sum[j]+a[(j+i+5)%5];
        }
      printf("%d ", sum[j]);  }
}