トピック
単純な圧縮アルゴリズムがあります。すべて小文字の英語の文字で構成される文字列の場合、2つ以上連続している同じ文字の部分は連続した数字に圧縮され、文字の他の部分は変更されません。たとえば、文字列aaabbccccは文字列に圧縮されます3abb4cd解凍関数を記述し、入力文字列に従って合法的に圧縮された文字列であるかどうかを判断してください。入力が有効な場合は解凍された文字列を出力し、そうでない場合は文字列「!error」を出力してエラーを報告します。
説明を入力してください:
输入一行,为一个ASCII字符串
长度不超过100字符
用例保证输出的字符串长度也不会超过100字符
复制代码
出力の説明:
若判断输入为合法的经过压缩后的字符串
则输出压缩前的字符串
若输入不合法 则输出字符串"!error"
复制代码
例1:
输入:4dff
输出: ddddff
解释:4d扩展为4个d ,故解压后的字符串为ddddff
复制代码
例2:
输入:2dff
输出: !error
解释:2个d不需要压缩 故输入不合法
复制代码
例3:
输入:4d@A
输出: !error
解释:全部由小写英文字母组成的字符串,压缩后不会出现特殊字符@和大写字母A 故输入不合法
复制代码
コード
function decode(s) {
const reg = new RegExp(/(\w)\1{2}/g);
if (reg.test(s)) {
console.log('!error');
} else {
const len = s.length;
let num = 0;
let string = '';
const list = [];
let result = null;
for (let i = 0; i < len; i++) {
const c = s[i];
if (isDigit(c) || isAlp(c)) {
if (isDigit(c)) {
if (string) {
list.push([1, string]);
}
num = num * 10 + Number(c);
string = '';
} else {
string += c;
if (num === 0) {
} else if (num < 3) {
result = '!error';
break;
} else {
if (i < len - 1) {
if (c === s[i + 1]) {
result = '!error';
break;
}
}
list.push([num, string]);
string = '';
}
num = 0;
}
} else {
result = '!error';
break;
}
}
if (result) {
console.log(result);
} else {
if (num > 0) {
console.log('!error');
} else {
if (string) {
list.push([1, string]);
}
let r = '';
list.forEach((v) => {
const [n, s] = v;
r += s.repeat(n);
});
console.log(r);
}
}
}
function isAlp(s) {
const n = s.charCodeAt() - 'a'.charCodeAt();
return n >= 0 && n <= 26;
}
function isDigit(s) {
const n = s.charCodeAt() - '0'.charCodeAt();
return n >= 0 && n <= 9;
}
}
const testList = ['4dff', '2dff', '4d@A', '5a', '3a4b'];
testList.forEach((v) => {
decode(v);
});
复制代码