找回密码
 加入
搜索
查看: 271|回复: 8

[效率算法] 怎么让一个数组变成这样

[复制链接]
发表于 2024-3-28 20:22:00 | 显示全部楼层 |阅读模式
现在数组是:

['a','b','c','c','c','d,'d,'d,'d,'d,'d','e','f','g','g','g','g','g','h']



想能过算法变成

['a','b','ccc','dddddd','e','f','ggggg','h']




意思是只要相邻的是一样的都变成一组。@afan 大佬帮帮我,谢谢
发表于 2024-3-28 20:28:15 | 显示全部楼层
本帖最后由 怪咖很怪i 于 2024-3-28 20:29 编辑


#include <Array.au3>

Global $arr = ['a','b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd', 'e', 'f', 'g', 'g', 'g', 'g', 'g', 'h']
Global $result[1]
Global $temp = $arr[0]

For $i = 1 To UBound($arr) - 1
    If $arr[$i] = $arr[$i - 1] Then
        $temp &= $arr[$i]
    Else
        _ArrayAdd($result, $temp)
        $temp = $arr[$i]
    EndIf
Next
_ArrayAdd($result, $temp)
_ArrayDelete($result, 0) ; 删除第一个空元素
_ArrayDisplay($result)
ConsoleWrite("合并后的结果数组:" & _ArrayToString($result, ",") & @CRLF)
发表于 2024-3-28 20:51:55 | 显示全部楼层



#include <String.au3>
#include <array.au3>
Local $aAry[10000]
For $i = 0 To UBound($aAry) - 1
        $aAry[$i] = Chr(Random(97, 122, 1))
Next
;~ _ArrayDisplay($aAry)
Local $oZD = ObjCreate('Scripting.Dictionary')
For $i = 0 To UBound($aAry) - 1
        If Not $oZD.Exists($aAry[$i]) Then
                $oZD.add($aAry[$i], 1)
        Else
                $oZD.item($aAry[$i]) = $oZD.item($aAry[$i]) + 1
        EndIf        
Next
Local $aAryOut = $oZD.keys
_ArraySort($aAryOut)
;~ _ArrayDisplay($aAryOut)
For $i = 0 To UBound($aAryOut) -1
        $aAryOut[$i] = _StringRepeat($aAryOut[$i],$oZD.item($aAryOut[$i]))
Next        
_ArrayDisplay($aAryOut)


发表于 2024-3-28 20:57:16 | 显示全部楼层
#include <Array.au3>
Local $arr = ['a', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd', 'e', 'f', 'g', 'g', 'g', 'g', 'g', 'h']
Local $aNew = _test($arr)
_ArrayDisplay($aNew)
Func _test($arr)
        If UBound($arr, 0) <> 1 Then Return SetError(1)
        Local $aRt[UBound($arr)], $sLeft, $iX = -1
        For $ii = 0 To UBound($arr) - 1
                If $arr[$ii] = $sLeft Then
                        $aRt[$iX] &= $arr[$ii]
                Else
                        $sLeft = $arr[$ii]
                        $iX += 1
                        $aRt[$iX] = $arr[$ii]
                EndIf
        Next
        ReDim $aRt[$iX + 1]
        Return $aRt
EndFunc   ;==>_test
 楼主| 发表于 2024-3-28 21:56:08 | 显示全部楼层
感谢各位了。。。谢谢
发表于 2024-3-29 01:32:19 | 显示全部楼层
我也凑个热闹

 #include <array.au3>
 Local $arr = ['a', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd', 'e', 'f', 'g', 'g', 'g', 'g', 'g', 'h']
 Local $out,$temp
 For $i = 0 To UBound($arr)-1
        If StringCompare($arr[$i],$temp)= 0 Then 
                $out &= $arr[$i]
        Else
                $out &=','&$arr[$i]
        EndIf                 
        $temp = $arr[$i] 
Next
$out = StringSplit(StringTrimLeft($out,1),",",2)
_ArrayDisplay($out)
 
发表于 2024-3-29 09:36:17 | 显示全部楼层
试着用正则处理,用标志位 $STR_REGEXPARRAYGLOBALMATCH (3) 只能拿到一个字符,用 $STR_REGEXPARRAYGLOBALFULLMATCH (4) 就可以了,如果能直接分割出来就好了

#include <Array.au3>
Local $arr = ['a', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd', 'e', 'f', 'g', 'g', 'g', 'g', 'g', 'h']
Local $sArr = _ArrayToString($arr, '')
Local $aRet = StringRegExp($sArr, '(.)\1{0,}', 4)

Local $aResult[0]
For $t In $aRet
    _ArrayAdd($aResult, _ArrayExtract($t, 0, 0)[0])
Next

_ArrayDisplay($aResult)
 楼主| 发表于 2024-3-29 19:22:51 | 显示全部楼层
谢谢各位大佬。。。。。。。结贴了。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-25 13:43 , Processed in 0.077874 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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