恭喜,你发布的帖子
发布于 2025-05-23 10:00:22
14楼
// data: Array of Int,6格 就是 0..5
#uData := DINT_TO_INT(IN:= UPPER_BOUND(ARR := #data, DIM := 1));
// buf: Array of Int,填的数字 1~6 就是 0..5
#uBuf := DINT_TO_INT(IN := UPPER_BOUND(ARR := #buf, DIM := 1));
// init
FOR #i := 0 TO #uBuf DO
#buf[#i] := 0;
END_FOR;
#ret := FALSE;
// data -> buf
FOR #i := 0 TO #uData DO
#index := #data[#i];
IF #index = 0 THEN
CONTINUE; // 未填写
END_IF;
#index := #index - 1;
IF #index > #uBuf THEN
RETURN; // 无效数据
END_IF;
IF #buf[#index] = 0 THEN
#buf[#index] := #i + 1;
ELSE
RETURN; // 重复
END_IF;
END_FOR;
// 小数未用 但 大数已用
FOR #i := 0 TO #uBuf - 1 DO
IF #buf[#i] = 0 AND #buf[#i + 1] > 0 THEN
RETURN;
END_IF;
;
END_FOR;
#ret := TRUE;
============
用空间换时间,空间主要看所填的数字的范围,因为要看是否重复,因此范围不会大
如果要求是可以重复 n 次,可以扩展 buf 的定义,改成二维数组,内部记录已重复的次数+每次所在的位置
上述程序稍改即可
请填写推广理由:
分享
只看
楼主