ioripalm 发表于 2013-11-21 21:08:16

[已解决]求个快速的算法:查找数组内缺少的插入一行。

本帖最后由 ioripalm 于 2013-11-28 07:26 编辑

正常情况下,数组大小
如下:
Row      Col0   Col1
          255               
          1          CM1
          2          dm2
          3          kc1
          4          mc1
          5          qc1
          6          df1
          7          gl2
[.]         .         xx.
省略
[.]         .         xx.
[.]         .         xx.
      255   xxx

非正常情况下,数组大小
Row       Col0   Col1
          X
          1          CM1
          2          dm2
          3          kc1
          5          qc1
          6          df1
          7          gl2
          8          cc1
[.]         .         xx.
省略
[.]         .         xx.
[.]         .         xx.
          255      xxx


数组的Col1是1-255的自然数(代表IP最后一段),Col2是计算机名,每个计算机名都是和IP对应的,不能错位
也就是说非正常情况下,数组的数据会少几个,具体少哪几个不知道。
有没有什么算法可以找到少的那几个,然后将少的添加到应在的位置,让数组保持正常状态。由于不知道计算机名,也就只能添加Col1,Col2可以留空。
效果如下:
Row      Col0   Col1
          255               
          1          CM1
          2          dm2
          3          kc1
          4         
          5          qc1
          6          df1
          7          gl2

haijie1223 发表于 2013-11-21 22:11:08

看来是个固定元素的二维数组,对电脑来说,重新赋值256个元素的二维数组应该不是什么难事~
#include <array.au3>
Dim $ip
_Def()
_ArrayDisplay($ip, "初次赋值数组")
_ArrayDelete($ip, 8)
_ArrayDisplay($ip, "删掉一组元素后数组")
For $i = 0 To 255
        If $ip[$i] <> $i Then _Def()
Next
_ArrayDisplay($ip, "检测后重新赋值数组")
Func _Def()
        ReDim $ip
        $ip = 255
        $ip = ""
        For $i = 1 To $ip
                $ip[$i] = $i
                $ip[$i] = "IP" & $i
        Next
EndFunc   ;==>_Def

user3000 发表于 2013-11-21 22:30:47

才两百来个,确实像发哥这样以“序号”检测吧。大数据应该用数据库。

ioripalm 发表于 2013-11-22 19:24:23

本帖最后由 ioripalm 于 2013-11-22 19:26 编辑

回复 2# haijie1223

老大,COL1下面IP1不一定是IP1的,是随机的计算机名。
要是固定的这样,就好弄了。

haijie1223 发表于 2013-11-22 19:35:07

回复 4# ioripalm


    那就把元素换成计算机名就是了~

ioripalm 发表于 2013-11-22 19:56:27

回复 5# haijie1223


    怎么换呢?我重新编辑了问题,帮忙看下!我觉得你那个脚本只能解决计算机名是“IP+地址”这样的情况,实际是每个地址对应的计算机名是不一样的,不能错位。少的补上IP,留空计算机名。

haijie1223 发表于 2013-11-22 22:05:04

回复 6# ioripalm


    是啊,每台计算机对应一个ip,只要路由器不重启,一般情况下不会错位的,建议程序运行之前,先扫描一下网络,把ip和计算机名对应一下,把对应的数据放入数组,不就转化成我的代码功能了么~~

ioripalm 发表于 2013-11-27 13:18:12

回复 7# haijie1223


    别把问题复杂化啊,又弄什么路由器了?情况就是上面的数组,缺少的行加进去,就这么简单,如果这个数组不是ip和计算机名呢?是个员工号对应工资表呢?我举例说ip是为了形象化一些!
就是单纯的拿第二个数组下手,排列为第一个数组那样。

afan 发表于 2013-11-27 14:40:33

Dim $a = [,,,,,,,,,,]
;~#include <Array.au3>
;~_ArrayDisplay($a, '')

Local $sArr = '', $sArrAdd = '', $iX = 0, $i
For $i = 1 To UBound($a) - 1
        $iX += 1
        If $a[$i] = $iX Then
                $sArr &= $a[$i] & '|' & $a[$i] & @LF
        Else
                $i -= 1
                $sArr &= $iX & '|' & @LF
                $sArrAdd &= $iX & ','
        EndIf
Next
MsgBox(0, '补足', $sArr)
MsgBox(0, '缺位', $sArrAdd)

haijie1223 发表于 2013-11-27 18:32:54

回复 8# ioripalm


    哦,那你应该提前说清楚了,可能是IP,可能是员工号,可能是工资表,可能是姓名,可能是性别,可能是年龄,可能是。。。问题的解决方法不止一种,当然是具体问题具体对待了。既然你举例是IP,那当然要拿IP进行讨论。总的来说,还是那个思路,提前把数组写好了,然后遍历检查就好了~

ioripalm 发表于 2013-11-28 07:25:44

感谢A饭有一次解决了我的问题,每次都是A到成功啊!
页: [1]
查看完整版本: [已解决]求个快速的算法:查找数组内缺少的插入一行。