找回密码
 加入
搜索
查看: 6835|回复: 9

[系统综合] 判断序号是否连续,如果不连续的话判断缺哪些数字 [已解决]

  [复制链接]
发表于 2012-1-14 15:36:29 | 显示全部楼层 |阅读模式
本帖最后由 骗子 于 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

对于不是从1开始的序列好像还需要改进,谢谢了

这是我的想法:
user3000 发表于 2012-1-14 16:58

能看懂,谢谢了



afan 发表于 2012-1-14 17:31

谢谢,虽然看不太懂

参与一下
kevinch 发表于 2012-1-14 18:09

谢谢,虽然看不太懂

netegg 发表于 2012-1-14 23:35

简单,明了,牛~!
发表于 2012-1-14 16:31:55 | 显示全部楼层
这是我的思路,因为是新手不敢说是正解!供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[0]] Step 1
        If $array[$i] <> $i Then
                _ArrayInsert($array, $i, $i)
                $text &= $i & ','
        EndIf
Next
_ArrayDisplay($array)
MsgBox(0,'','缺少的序号是:' & $text)

评分

参与人数 1金钱 +10 收起 理由
骗子 + 10 谢谢

查看全部评分

发表于 2012-1-14 16:58:21 | 显示全部楼层
这是我的想法:
#include<array.au3>
Local $array[15] = [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14, 16, 18]
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)

评分

参与人数 2金钱 +20 收起 理由
骗子 + 10 谢谢
bdancerlc + 10 思路不错,学习了..

查看全部评分

发表于 2012-1-14 17:31:10 | 显示全部楼层
本帖最后由 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[0] - $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

评分

参与人数 1金钱 +10 收起 理由
骗子 + 10 谢谢

查看全部评分

发表于 2012-1-14 18:09:01 | 显示全部楼层
#include<array.au3>
Local $array[15] = [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14, 16, 18]
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)
参与一下

评分

参与人数 1金钱 +10 收起 理由
骗子 + 10 谢谢

查看全部评分

发表于 2012-1-14 23:23:21 | 显示全部楼层
很明显For To Next 是最为关键的,这位骗子兄,我猜他在骗回复

评分

参与人数 1贡献 +1 收起 理由
骗子 + 1 骗回复有什么用?

查看全部评分

发表于 2012-1-14 23:35:56 | 显示全部楼层
本帖最后由 netegg 于 2012-1-15 00:08 编辑

[au3]#include <array.au3>
local $aA
For $i = _arraymin($aA) To _ArrayMax($aA)
        If _ArraySearch($aA, $i) = -1 Then ConsoleWrite($i & @cr)
next[/au3]

评分

参与人数 1金钱 +10 贡献 +10 收起 理由
骗子 + 10 + 10 牛!

查看全部评分

发表于 2012-1-15 10:23:35 | 显示全部楼层
啊, 还是蛋老大对内置众多函数掌握得彻底!
几行代码就做到了!
发表于 2012-1-15 12:58:31 | 显示全部楼层
啊, 还是蛋老大对内置众多函数掌握得彻底!
几行代码就做到了!
user3000 发表于 2012-1-15 10:23



    内置函数不一定满足效率的要求,如果要考虑效率一般还得自己写

p.s,蛋蛋第3行的 _arraymin($aA) 及 _ArrayMax($aA) 应该加第二个参数1
发表于 2012-1-15 13:11:30 | 显示全部楼层
本帖最后由 netegg 于 2012-1-15 13:35 编辑

回复 9# afan

这个倒是,不过lz题目中的这个要求,似乎和效率关系不大,除非是数组太大,这样的话可能上面的所有代码都要重写

另外,简单说一句,楼上各位都是从已知条件(不连续数组)找未知元素(所缺元素)以得到已知结果(连续数组),这样势必要复杂些,反过来想,结果既然已知且又是连续的,定值循环再合适不过,再反推原数组元素,效果相同,少了遍循环
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-10-1 01:31 , Processed in 0.115770 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表