【问题标题】:Insert into array at multiples of a value, where value increments in between array passes以值的倍数插入数组,其中值在数组传递之间递增
【发布时间】:2020-01-04 19:29:36
【问题描述】:

我有一个基本数组和任意数量的数组 - 实际上不是数组,而是按顺序计算的值(最后会详细介绍)。我想在基本数组值之前插入新计算的值。

我使用的语言有动态数组,并且有一个名为insert 的方法,可以在指定的索引中插入值。

arr = [0, 1, 2]

// insert `9` in index `0`
arr.insert( 0, 9 )

// result
// [9, 0, 1, 2]

// insert `8` in index `2`
arr.insert( 2, 8 )

// result
// [9, 0, 8, 1, 2]

可视化问题:

基本数组由o组成,新值为ab等。

// values

o o o o o
a a a a a
b b b b b
c c c c c
d d d d d
e e e e e


// desired result in the end of each value calculation loop

o     o     o     o     o
oa    oa    oa    oa    oa  
oab   oab   oab   oab   oab 
oabc  oabc  oabc  oabc  oabc

逐步(循环)插入可视化

o     o     o     o     o

// insert( 1, a )
oa    o     o     o     o

// insert( 3, a )
oa    oa    o     o     o

// insert( 5, a )
oa    oa    oa    o     o

// insert( 7, a )
oa    oa    oa    oa    o

// insert( 9, a )
oa    oa    oa    oa    oa

// insert( 2, b )
oab   oa    oa    oa    oa

// insert( 5, b )
oab   oab   oa    oa    oa

// insert( 8, b )
oab   oab   oab   oa    oa

// insert( 11, b )
oab   oab   oab   oab   oa
.
.
.

它在代码中的实际外观:

for( j = 0; j < 10; j++ )
{
    for( i = 0; i < baseArrLength; i++ )
    {
        idx = (j+1) + (i * (j+2));

        base.insert( idx, val );
    }
}

第一个循环确定要添加的新值的“类型数量”。以前面所说的字母形式讲,当j == 0时,计算并插入a的值;当j == 1,做b

第二个循环进行计算,最好将计算值插入基本数组(主要问题)。

i*2+1 适用于第一个循环 (a),但我不确定如何修改它以适应其余循环。如何确定要插入的idx

insert 思考我做错了吗?

编辑:测试 sn-p:

期望的输出: o a b c d o a b c d o a b c d o a b c d o a b c d

function test()
{
    base = ["o","o","o","o","o"];

    baseLength = 5;

    for( j = 0; j < 4; j++ )
    {
        for( i = 0; i < baseLength; i++ )
        {
            // the problem
            idx = (j+1) + (i * (j+2));

            // "a" or "b"...
            val = GetVal(j);

            base.insert( idx, val );
        }
    }

    for( i = 0; i < base.len(); i++ )
    {
        print( base[i] + " " );
    }
}

function GetVal(j)
{
    switch(j)
    {
        case 0: return "a";
        case 1: return "b";
        case 2: return "c";
        case 3: return "d";
    }
}

【问题讨论】:

  • 看起来“我使用的语言”是Java?
  • 将设置val的代码添加到您的sn-p中,以便我们看到。
  • @cellepo val 的值和语言无关,因为这是一个算法问题。
  • 使用包含的代码 sn-ps 提出的这个问题使语言相关。我不确定为什么在此处隐藏 sn-ps 所用的语言如此重要,因为 sn-ps 本身就是。语言也是相关的,因为如果不熟悉这里使用的语言的人试图理解这个问题,他们可能不会立即明白他们应该使用哪种语言来表示他们不熟悉的语法(即:“要从代码中找出case 的东西,我应该用“Python”还是“Java”或...“谷歌”。
  • 我同意这个问题主要是算法问题,但正因为如此,在cs.stackexchange.com 上提问会更好

标签: arrays algorithm indexing merge insert


【解决方案1】:

您的idx 逻辑错误。

// Loop 10 times
for(int j = 1; j < 11; j++){
    String val;
    // TODO: val becomes set from some calculation the Questioner does

    int idx = j;
    for(int i = 0; i < baseArrLength; i++){
        idx = idx + j + 1;
        base.insert(idx, val);
    }
}

【讨论】:

  • 我添加了一个我在原帖中使用的测试sn-p。使用您的答案,我得到以下输出:o o o b o c b d o c b d o c b d o c b d o c o d
【解决方案2】:

我在提问的同一天找到了公式。这是

(i+2) + (j * (i+2))

其中i 是外循环,j 是内循环。

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2013-10-30
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多