判断序号是否连续,如果不连续的话判断缺哪些数字 [已解决]
本帖最后由 骗子 于 2012-1-15 13:36 编辑一个数组中存放着一组本应该是连续的数据,可能会缺少某些数字,想判断出来到底缺哪些数据
例如0、1、2、3、4、5、7、8、9、10、11、13、14、16、18
判断是否连续可以用 数组中最大值减去最小值,如果等于数组的最大序号-1 就是连续的,如果不等于就是不连续。
判断缺少哪些文件我现在想到是重复在数组搜索,如果存在就不缺,不存在就缺。想请教大家一个简单点的方法来判断到底缺哪些数据
这是我的思路,因为是新手不敢说是正解!供LZ参考..
bdancerlc 发表于 2012-1-14 16:31 http://www.autoitx.com/images/common/back.gif
对于不是从1开始的序列好像还需要改进,谢谢了
这是我的想法:
user3000 发表于 2012-1-14 16:58 http://www.autoitx.com/images/common/back.gif
能看懂,谢谢了
afan 发表于 2012-1-14 17:31 http://www.autoitx.com/images/common/back.gif
谢谢,虽然看不太懂
参与一下
kevinch 发表于 2012-1-14 18:09 http://www.autoitx.com/images/common/back.gif
谢谢,虽然看不太懂
netegg 发表于 2012-1-14 23:35 http://www.autoitx.com/images/common/back.gif
简单,明了,牛~! 这是我的思路,因为是新手不敢说是正解!供LZ参考..
#include <IE.au3>
#include <array.au3>
Local $str = '13479' ;缺少2,5,6,8
Local $text
$array = StringSplit($str,'')
_ArrayDisplay($array)
For $i = 1 To $array[$array] Step 1
If $array[$i] <> $i Then
_ArrayInsert($array, $i, $i)
$text &= $i & ','
EndIf
Next
_ArrayDisplay($array)
MsgBox(0,'','缺少的序号是:' & $text)
这是我的想法:
#include<array.au3>
Local $array =
Local $result, $diff
For $i = 0 To UBound($array) - 2
$diff = $array[$i + 1] - $array[$i]
If $diff > 1 Then
For $ii = 1 To $diff - 1
$result &= $array[$i] + $ii & ' '
Next
EndIf
Next
MsgBox(0, '数组中缺少以下数字', $result) 本帖最后由 afan 于 2012-1-15 12:53 编辑
#include <Array.au3>
Local $str = '0,1,2,3,4,5,7,8,9,10,11,13,14,16,18'
Local $aNum = StringRegExp($str, '\d+', 3)
;_ArrayDisplay($aNum, '')
$aCK = _CKNum($aNum)
_ArrayDisplay($aCK, '缺少的数字')
Func _CKNum(ByRef $array)
If Not IsArray($array) Then Return SetError(1, 0, -1)
Local $Ub = UBound($array) - 1
Local $UbC = $array[$Ub] - $array - $Ub
If Not $UbC Then Return 1
Local $aOut[$UbC], $x = -1, $v0, $i, $j
For $i = 1 To $Ub
$v0 = $array[$i] - $array[$i - 1] - 1
If $v0 Then
For $j = 1 To $v0
$x += 1
$aOut[$x] = $array[$i - 1] + $j
Next
If $x = $UbC - 1 Then Return $aOut;如果后面都是连续的就见效率了
EndIf
Next
EndFunc ;==>_CKNum #include<array.au3>
Local $array =
Local $dic,$result,$n,$imax,$imin
$dic=ObjCreate("scripting.dictionary")
$imax=_arraymax($array,1)
$imin=_arraymin($array,1)
For $n=0 To UBound($array)-1
$dic($array[$n])=""
Next
$result=""
For $n=$imin To $imax
If Not $dic.exists($n) Then
If $result<>"" Then $result&=","
$result&=$n
EndIf
Next
$dic=0
MsgBox(0, '数组中缺少以下数字', $result)参与一下 很明显For To Next 是最为关键的,这位骗子兄,我猜他在骗回复{:face (238):} 本帖最后由 netegg 于 2012-1-15 00:08 编辑
#include <array.au3>
local $aA
For $i = _arraymin($aA) To _ArrayMax($aA)
If _ArraySearch($aA, $i) = -1 Then ConsoleWrite($i & @cr)
next 啊, 还是蛋老大对内置众多函数掌握得彻底!
几行代码就做到了! 啊, 还是蛋老大对内置众多函数掌握得彻底!
几行代码就做到了!
user3000 发表于 2012-1-15 10:23 http://www.autoitx.com/images/common/back.gif
内置函数不一定满足效率的要求,如果要考虑效率一般还得自己写
p.s,蛋蛋第3行的 _arraymin($aA) 及 _ArrayMax($aA) 应该加第二个参数1 本帖最后由 netegg 于 2012-1-15 13:35 编辑
回复 9# afan
这个倒是,不过lz题目中的这个要求,似乎和效率关系不大,除非是数组太大,这样的话可能上面的所有代码都要重写
另外,简单说一句,楼上各位都是从已知条件(不连续数组)找未知元素(所缺元素)以得到已知结果(连续数组),这样势必要复杂些,反过来想,结果既然已知且又是连续的,定值循环再合适不过,再反推原数组元素,效果相同,少了遍循环
页:
[1]