如何检查数组是否包含1到n ^ 2个整数?

时间:2016-10-03 06:55:32

标签: c multidimensional-array

假设我想检查一个3x3阵列,我希望它包含1到9之间的所有数字。除了我在下面写下的那个之外,我想不出任何有效的方法。有没有更好的方法来解决这个问题?

<?php
echo $this->Form->input('from_address', array('required' => false,'label' => false, 'div' => false,
    'placeholder' => 'Enter from address', 'class' => 'form-control','id' => 'fromaddress'));
    ?>

     <?php echo $this->Form->input('from_lat', array('id' => 'fromlat'));  ?>
     <?php echo $this->Form->input('from_long', array('id' => 'fromlong'));  ?>

<script type="text/javascript">
$("#fromaddress").on('change', function() {   
    ajaxRequest = $.ajax({
    url: '<?php echo Router::url(array("controller" => "Orders", "action" => "searchCourier")); ?>',
        type: 'POST',
        data: {
            frmlat: $("#fromlat").val(),
            frmlong: $("#fromlong").val()
        },
       dataType: "html",
       success: function(response) {
            $("#courier_locations").html(response);
        },
        complete: function() {
            $('.spinicon').hide();
        }
    });
});

</script>

4 个答案:

答案 0 :(得分:3)

是。还有更好的方法。

使用布尔数组而不是第三个循环会更合理。保留一组布尔值,最初都设置为false。对于找到的每个数字,将数组中的相应索引标记为true。在行和列循环结束时,如果数组中的所有条目都设置为true,则会找到所有数字。

为了进一步优化,您可以声明一个计数器变量。每次找到一个数字时,使用布尔数组检查是否已找到该数字。如果没有,请递增计数器。在循环结束时,如果计数器为9,则表示您找到了9个唯一编号。

如果您发现重复,您甚至可以提前终止。这将进一步提高性能,但只有在要查找的唯一数字的数量和它们居住的空间数量相同时才有效。即如果您有18个空格并且想要检查所有数字1-9,则这不起作用。

答案 1 :(得分:1)

怎么样:

bool nums[9] = {false, false, false, false, false, false, false, false, false};

for (int row = 0; row < 3; ++row) {
   for (int col =0; col < 3; ++col) {
      if (arr[row][col] < 1 || arr[row][col]> 9 || nums[arr[row][col] -1]) {
        // Number is out of range or previous it)
        break;
      }
      nums[arr[row][col] -1] = true;
   }
}

如果找到相应的值,nums存储为真。

答案 2 :(得分:0)

另一个想法是循环遍历k - 次 - k数组并总结所有元素。确保结果总和等于1+2+...+n = n*(n+1) / 2,其中n = k*k。这与所有元素都是唯一的(并且是正的)的条件相结合,确保数组包含{1,2,...,n}中的所有元素和唯一元素。

对于n=9,您需要检查总和是否等于45。对于较小的n,您可以使用位掩码来检查是否已经看过一个数字:if (n & (1 << current_number)) { seen; } else {not yet seen; mark as seen via n |= (1 << current_number); }

答案 3 :(得分:0)

不需要外部循环,您可以在找到第一个不匹配的项目时停止搜索。除非您出于某种原因需要列出所有不匹配的项目,但似乎并非如此(?)。

如果您知道尺寸始终很小,则可以进行进一步的微观优化。在这个例子中,它们被假定为&lt; 256:

#include <stdint.h>
#include <stdbool.h>

bool is_arr_ok8 (uint_fast8_t row, uint_fast8_t col, int arr[row][col])
{
  uint_fast8_t count=1;

  for (uint_fast8_t r=0; r<row; r++)
  {
    for(uint_fast8_t c=0; c<col; c++)
    {
      if(arr[r][c] != count)
      {
        return false;
      }
      count++;
    }
  }

  return true;
}

这里最重要的是最里面的循环对应于最内层的维度。你也可以反过来做,它不会影响算法,但它会带来更糟糕的数据缓存性能。