Daily-Interview-Question
Daily-Interview-Question copied to clipboard
第 110 题:编程题,请写一个函数,完成以下功能
输入 输出
@lonycc 朋友,你明显理解错了,这道题的意思是:如果连续数字的话,就取连续的第一个数和最后一个数,中间用~隔开。如果不连续就用,隔开。
function simplifyStr(str) {
let pre = void 0;
return `${str},`.replace(/ /, '').replace(/\d+,(?=(\d+|\B))/g, (current, next) => {
const _current = +current.split(',')[0]
pre = pre === undefined ? +_current : pre
const res = +next === _current + 1 ? (
pre + 1 === _current ? '' : _current
) : (
pre + 1 === _current ? `~${_current}${next ? ',' : ''}` : current
)
pre = _current
return res
})
}
想看各位大佬的最佳操作,我就简陋的写了一下。
const nums1 = [1, 2, 3, 5, 7, 8, 10];
function simplifyStr(num) {
var result = [];
var temp = num[0]
num.forEach((value, index) => {
if (value + 1 !== num[index + 1]) {
if (temp !== value) {
result.push(`${temp}~${value}`)
} else {
result.push(`${value}`)
}
temp = num[index + 1]
}
})
return result;
}
console.log(simplifyStr(nums1).join(','))
我也来参与一下~
let arr = [1, 2, 3, 5, 7, 8, 10];
function transStr(arr) {
let result = arr.reduce((prev, next, index, array) => {
if (index > 0) {
if (next === array[index - 1] + 1) {
return prev + '~' + next
} else {
return prev + ',' + next
}
} else {
return next
}
}, '')
return (result + '').split(',').map(item => item.replace(/(\d{1,})(~\d{1,})*(~\d{1,})/, '$1$3')).join(',')
}
console.log( transStr(arr))
@lhyt 大佬,你的方法运行的结果,最后会多个逗号。。
function transformStr(str) {
const arr = str.split(',').map(x => parseInt(x));
let result = [arr[0], arr[1]], i = 1, isContinuous = false;
arr.forEach((value, index) => {
if (index > 1) {
if (value === result[i] + 1 && result[i] - result[i-1] === 1) {
result[i] = value;
isContinuous = true;
} else {
isContinuous = false;
result.push(value);
i++;
}
if(isContinuous || result[i] - result[i-1] === 1)result[i] = `~${result[i]}`;
}
})
return result.toString().replace(/,(?=~)/g, '');
}
const str = '1,2,3,5,7,8,10,11';
console.log(transformStr(str));
哈哈,还在疑惑呢,题目是啥意思,原来是markdown中两个~构成了删除线,要用\~来写~呢
function getSerial(src) {
let srcArray = src.split(',').map(num => +num)
if (srcArray.length === 0) return ''
let result = '' + srcArray[0]
let serialCount = 0
for (let i = 1; i < srcArray.length; i++) {
if (srcArray[i] !== srcArray[i - 1] + 1) {
result += (serialCount > 0 ? '~' + srcArray[i - 1] : '') + ',' + srcArray[i]
serialCount = 0
} else {
serialCount++
if (i === srcArray.length - 1) {
result += '~' + srcArray[i]
}
}
}
return result
}
@whyour 你这个方法在最后两位是连续的时候,结果不对。传入 '1,2,3,5,7,8' ,输出的是 1~3,5,7,8
const str = '1,2,3,5,7,8,10;
const transformStr = ( str ) => '1~3,5,7~8,10';
😈😈😈😈😈😈😈
public static void main(String[] args) { Scanner scan = new Scanner(System.in); String numsStr = scan.next(); String[] numsStrs = numsStr.split(","); // methodOne(numsStrs); methodTwo(numsStrs); }
private static void methodTwo(String[] numsStrs) {
int numsStrsLen = numsStrs.length;
if(numsStrs!=null && numsStrs.length>0){
System.out.print(numsStrs[0]);
}
boolean beforeFlag = false;
boolean flag = false;
for(int i=1; i<numsStrsLen; i++){
if(((Integer.valueOf(numsStrs[i-1])+1)+"").equals(numsStrs[i])){ // 说明连续
flag = true;
} else {
flag = false;
}
if(!flag && beforeFlag){
System.out.print("~"+numsStrs[i-1]+","+numsStrs[i]);
} else if(!flag && !beforeFlag){
System.out.print(","+numsStrs[i]);
}
beforeFlag = flag;
}
}
private static void methodOne(String[] numsStrs) {
int numsStrsLen = numsStrs.length;
boolean isEquals = Integer.valueOf(numsStrs[0])+Integer.valueOf(numsStrs[1])-1-2==0 ? true : false;
int beforeSub = Integer.valueOf(numsStrs[0]) - 1; // 之前的差值
int nowSub = 0;
String result = numsStrs[0];
for(int i=1; i<numsStrsLen; i++){
nowSub = Integer.valueOf(numsStrs[i]) - (i+1);
if(nowSub!=beforeSub && isEquals){ // 该值不相等但前一个相等
result += "~"+numsStrs[i-1]+","+numsStrs[i];
isEquals = false;
} else if(nowSub==beforeSub){
isEquals = true;
} else{
result += ","+numsStrs[i];
isEquals = false;
}
beforeSub = nowSub;
}
System.out.println("结果:"+result);
function classification(data){ if(!data)return data; let group = []; let result = data.split(','); let str = ''; for(let i = 0;i<result.length;i++){ if(i>0){ if(result[i]-1 == result[i-1]){ group[group.length-1].push(result[i]); }else{ group[group.length] = [result[i]]; } }else{ group[0] = [result[i]]; } } group.forEach(function(item,index){ if(item.length>1){ str += item[0] +'~' +item[item.length-1]; }else { str += item[0]; } if(index!==group.length-1){ str += ','; } }); console.log(str); return str;}
let str = '1,2,3,5,7,8,10,12,13,14,100,101,102';
const strGroup = (arr) =>
arr.reduce((acc, item) => {
let lastArr = acc.slice().pop() || []
let lastNum = lastArr.slice().pop()
if (lastNum == item - 1 || (lastNum && lastNum.match(/(\w*)(\w)/g)[1] == item - 1)) {
lastArr.pop()
let curStr = /\~.*/.test(lastNum)
? lastNum.replace(/\~.*/, `~${item}`)
: `${lastNum}~${item}`
lastArr.push(curStr)
} else {
acc.push([item])
}
return acc
}, []).join(',')
strGroup(str.split(',')) // 1~3,5,7~8,10,12~14,100~102
灵感来源 67题 ,来自 @benzhemin的求连续版本 https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/113#issuecomment-489482961
这种好像用bitmap也很好处理
const transformString = function(string) {
let first = null;
let tempArr = []
let arr = string.split(',').map(item => Number(item))
arr.forEach((current, index) => {
if(index === 0) {
first = current
} else {
let prev = arr[index - 1]
if(current !== prev + 1) {
first === prev ? tempArr.push(`${first}`) : tempArr.push(`${first}~${prev}`);
first = current
}
arr.length - 1 === index && (first === current ? tempArr.push(`${first}`) : tempArr.push(`${first}~${current}`))
}
})
return tempArr.join(',')
}
console.log(transformString('1,2,3,5,7,8,10,12,13,14,100,101,102'))
let str = "1, 2, 3, 5, 7, 8, 10";
function computed(str) {
let arr = str.split(",");
let pos = 0, index = 0, flag = true;
for (let i = 0; i <= arr.length; i++) {
if (Number(arr[i - 1]) + 1 == arr[i]) {
if (flag) {
pos = i;
}
index++;
flag = false;
} else {
if (!flag) {
arr.splice(pos, index - 1, "~");
}
flag = true;
i = i - index;
index = 0;
}
}
return arr.join(",").replace(/\,~\,/g, "~");
}
console.log(computed(str));
const numRange = function (arr) {
arr = arr.split(',')
let result = []
let map = {}
let count = 0
for (let i = 0; i < arr.length; i++) {
if (i === 0) {
map[count] = [arr[i]]
continue
}
if (+arr[i] - 1 === +arr[i - 1]) {
map[count].push(arr[i])
} else {
count++
map[count] = [arr[i]]
}
}
for (const key in map) {
if (map.hasOwnProperty(key)) {
const range = map[key]
if (range.length > 1) {
result[key] = [range[0], range[range.length - 1]].join('~')
} else {
result[key] = range.join('')
}
}
}
return result.join(',')
}
numRange('1,3,4,5,6,8,9,20') // => "1,3~6,8~9,20"
function f(params) {
const arr = params.split(',')
const res = []
let first = arr[0]
let next = 0
for (let i = 0; i < arr.length; i++) {
if (+arr[i]+1 === +arr[i+1]) {
next = arr[i + 1]
} else {
if (next !== 0) {
res.push(`${first}~${next}`)
} else {
res.push(arr[i])
}
first = arr[i + 1]
next = 0
}
}
return res.join(',')
}
// output '1~3,5,7~9,11~12'
var str = '1,2,3,5,7,8,9,11,12';
function simplifyStr(str) {
var arr = str.split(',').map(item => parseInt(item));
let result = arr.map((current, index) => {
var next = arr[index + 1] - 1;
var prev = arr[index - 1] + 1;
if (next == current && prev == current) {
return '';
} else if (next != current && prev == current) {
return '~' + current;
} else {
return current;
}
});
return result.filter((item)=>item).join(',').replace(/(,~)*/g,'~');
}
simplifyStr(str);
function reSort(arr) {
var current = 0;
var len = 0;
for(let i=1; i<arr.length; i++) {
if(arr[i] - arr[i-1] !== 1) {
if(!len) continue;
arr.splice(current , len - 1, '~');
i = i - len + 2;
current = 0;
len = 0;
}else{
current = current || i;
len++;
if(i === arr.length - 1) {
arr.splice(current , len - 1, '~');
}
}
}
return arr.join(',').replace(/,~,/g, '~');
}
var str = "1,2,3,4,6,7,9,10,11";
console.log(reSort(str.split(',')));
求大佬们点评
测试通过
function transformStr(str) {
let arr = str.split(',')
let i = 0
let ret = []
for (let j = 1; j <= arr.length; j++) {
if (arr[j] - arr[j - 1] !== 1) {
ret.push(j - i === 1 ? arr[i] : `${arr[i]}~${arr[j - 1]}`)
i = j
}
}
return ret.join(',')
}
一行代码(嘿嘿)
修改了重名变量,方便理解
function transArr(str) {
return str.split(",").map((item, key, arr) => (arr[key + 1] != +item + 1 || key === 0 || arr[key - 1] != item - 1) ? item == +arr[key - 1] + 1 ? `,${item}` : item : ",").toString().replace(/(,)\1+/g, '~')
}
function change(str) {
let arr = str.split(','),
content = [],
lsArr = []
arr.forEach(element => {
if (lsArr.length > 0) {
if (element - lsArr.slice(-1) == 1) {
lsArr.push(element)
} else {
// 判断lsArr是否为一个值
if (lsArr.length > 1) {
content.push(lsArr.shift() + '~' + lsArr.pop())
} else {
content.push(lsArr[0])
}
lsArr = [element]
}
} else {
lsArr.push(element)
}
})
// 循环结束
if (lsArr.length > 1) {
content.push(lsArr.shift() + '~' + lsArr.pop())
} else {
content.push(lsArr[0])
}
return content.join(',')
}
let res = change(str)
console.log(res) //1~3,5,7~8,10
const nums1 = [ 1, 2, 3, 4, 5, 7, 8, 10, 13, 22, 122 ];
const returnArray: string[] = [];
let num = nums1[ 0 ];
nums1.forEach((item, index) => {
if (item + 1 !== nums1[ index + 1 ]) {
if (item - 1 === nums1[ index - 1 ]) {
returnArray.push(${num}-${item}
)
} else {
returnArray.push(item + '')
}
num = nums1[ index + 1 ];
}
});
console.log(returnArray)
var str110 = '1,2,3,5,7,8,10'
var array110 = str110.split(',')
let arrResult = []
let tmp = 1
for (let i in array110) {
let item = parseInt(array110[i])
let item1 = parseInt(array110[parseInt(i) + 1])
if (item1 - 1 !== item) {
if (tmp !== item) {
tmp = tmp + '~' + item
}
arrResult.push(tmp)
tmp = item1
}
}
console.log(arrResult.join())
function transStr() {
let args = arguments[0].split(',').map((num) => parseInt(num))
let [str1, temp, num, flag] = ['', args[0], 0, true]
for(let n of args) {
if(flag) {
flag = !flag
} else {
if ((n-1) !== temp) {
str1 += `${temp},`
temp = n
num = 0
} else {
if (num === 0) {
str1 += `${temp}~`
}
num++
temp = n
}
}
}
str1 += temp
console.log(str1)
} transStr('1,2,3,5,7,8,10')
function getSeries(arr){
let temp = arr[0]
return arr.reduce((acc,cur,index)=>{
if(cur + 1 !== arr[index + 1]) {
if(temp !== cur) {
acc.push(`${temp}~${cur}`)
} else {
acc.push(cur)
}
temp = arr[index + 1]
}
return acc
},[]).join(',')
}
export function intervalNum (list) {
let result = [] // 分隔连续数字的区间标记
let prewVal = null
let initVal = null
if (list === '') {
return ''
}
list = list.split(',')
// mark记录非连续数字的第一个值
list.forEach((item, index) => {
if (prewVal && Number(prewVal) === (Number(item) - 1)) {
result.push(initVal + '->' + index + '~' + item)
// (marks[marks.length - 1] - mark[marks.length - 2] === 1) ? marks.splice(marks.length - 2, 1) : () => {}
if (result[result.length - 1].indexOf(initVal + '->') > -1) {
result.splice(result.length - 2, 1)
}
} else if (!prewVal) {
initVal = item
result.push(item + '->')
} else {
initVal = item
result.push(item + '->')
}
prewVal = item
})
result = result.map(item => {
return item.split('->')[0] + (item.split('->')[1].split('~ ')[1] ? item.split('->')[1].split('~ ')[1] : '')
})
return result.join(',')
}
var continueNum=function(str){
var numarr=str.split(",");
var result=[];var queue=[];
for(let i=0;i<numarr.length;i++)
{
if((numarr[i+1]-numarr[i])==1)
{
queue.push(numarr[i]);
}
else
{
queue.push(numarr[i]);
if(queue.length!=1)
{result.push(queue[0]+"~"+queue[queue.length-1]);queue.length=0}
else
{result.push(queue[0]);queue.length=0}
}
}
return result.join(",");
}
// 三种情况
// 1. 前一个元素与当前元素值不是连续的, 则当前元素正常显示, 例如[1,2,3]中的1, [5, 7] 中的5
// 2.1 前一个元素与当前元素连续, 且后一个元素也连续, 则不显示, 例如[1,2,3]中的2
// 2.2 前一个元素与当前元素连续, 但后一个元素, 则显示为 ` ~ ${item}`, 例如[1,2,3]中的3, 最终显示为 `~3`, 最忠效果为 1~3
function getFormagedString(arrar = []) {
return arrar.reduce((result, current, index, arr) => {
const prevValue = arr[index - 1]
const nextValue = arr[index + 1]
if( current - 1 !== prevValue ) { // 前面没有连续值 123中的1
return `${result}, ${current}`
} else {
if(current + 1 !== nextValue) { // 前面有连续值 且 后面没有连续值 123中的3
return `${result} ~ ${current}`
} else { // 前面有连续值 且 后面有连续值, 123中的2
return result
}
}
})
}
var str = "1,2,3,5,7,8,10,12,13,14,100,102"
var fn = (arr) => {
let tmp = [];
let j, k;
for (let i = 0; i < arr.length; i++) {
j = k = i; // j,k 同一起点
while (arr[i+1] === arr[i] + 1) {
// k 随 i 向右滑动
k = ++i;
}
v = j < k ? `${arr[j]}~${arr[k]}` : arr[j]
tmp.push(v)
}
return tmp.join()
}
fn(str.split(',').map(e => +e))
function getFormatedArr(str = null) {
if (str) {
let arr = str.split(","),
cpNum = null,
cpIndex = 0,
resArr = [];
arr.forEach((num, index) => {
if (!index) {
cpNum = arr[index];
}
if (num - cpNum !== index - cpIndex) {
resArr.push(
index === cpIndex + 1 ? arr[cpIndex] : `${cpNum}~${arr[index - 1]}`
);
cpNum = arr[index];
cpIndex = index;
if (index === arr.length - 1) {
resArr.push(
index === cpIndex ? arr[index] : `${cpNum}~${arr[index]}`
);
}
}
});
return resArr.join(",");
} else {
return "";
}
}
getFormatedArr("1,2,4,5,6,7,9,10,14,17,18,19,30");
好像有点繁琐。。。囧RZ
看起来很容易,实则很耗工夫的一道题;可能是我菜!!! function a(sl){ sl=sl.split(','); var str=sl[0]; var first = sl[0]>>>0; var rem = 0; for(var i=1;i<=sl.length;i++){ if(first+1!=sl[i]){ if(i-rem>1){ str+=('-'+first+','+sl[i]); }else{ str+=','+sl[i]; } rem = i; } first = sl[i]>>>0; } console.log(str.replace(',undefined','')) } a('1,2,4,5,7,9,10');a('1,2,4,5,7,9,10,13');a('1,2,3,4,5,6,7,8');
input: '1,2,3,5,7,8,10'
output: '1~3,5,7~8,10'
function semantization(str) {
const arr = str.split(',').map(i => parseInt(i, 10));
var o = '';
for (let i = 0; i < arr.length; ) {
const current = arr[i];
// const next = arr[i + 1];
let j = 1;
let end = null;
while (current + j === arr[i + j]) {
end = arr[i + j];
j++;
}
if (end !== null) {
o += `${arr[i]}~${end},`;
i += j;
} else {
o += arr[i] + ',';
i++;
}
}
return o.substr(0, o.length - 1);
}
semantization('1,2,3,5,7,8,10');
// "1~3,5,7~8,10"
function chang(arr) {
let start = 'undefined',
end, arr2 = [];
for(let i = 0; i < arr.length; i++) {
if(arr.length - 1 == i) {
if(start != 'undefined') {
arr2.push(start + '~' + end);
start = 'undefined';
end = 'undefined';
} else {
arr2.push(arr[i]);
}
} else if(arr[i] + 1 == arr[i + 1]) {
if(start == 'undefined') {
start = arr[i];
}
end = arr[i + 1];
} else {
if(start != 'undefined') {
arr2.push(start + '~' + end);
start = 'undefined';
end = 'undefined';
} else {
arr2.push(arr[i]);
}
}
}
return arr2;
}
console.log(chang([1, 2, 3, 5, 7, 8, 10])); //["1~3", 5, "7~8", 10]
output() {
const args = [...arguments];
let begin = 0, end, res = [];
for (let i = 0; i < args.length; i++) {
const item = args[i];
if (item + 1 === args[i + 1]) {
continue;
} else {
end = i;
begin === end ? res.push(item) : res.push(${ args[begin] }~${ args[end] }
);
begin = i + 1;
}
}
return res;
}
let arr = [1,2,3,5,7,8,10];
function fn(arr) {
let res = [];
for(let i=0;i<arr.length;i++){
let now = i;
while(arr[i] === arr[i+1]-1)i++;
res.push(i === now?arr[i]:arr[now]+"~"+arr[i]);
}
return res.join(",")
}
console.log(fn(arr));//1~3,5,7~8,10
不知道这个方法是否可行?
var str = '0,1,2,3,4,5,6,7,8,9,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,55,88,100,101,111'
function sortStr(str) {
var sortedArr = []
var segmentBegin = null,
segmentEnd = null
str.split(',').forEach((curChar, index, arr) => {
var nextChar = arr[index + 1]
if (+curChar === +nextChar - 1) {
segmentBegin === null && (segmentBegin = curChar)
segmentEnd = nextChar
} else {
segmentBegin !== null && segmentEnd !== null
? sortedArr.push(segmentBegin + '~' + segmentEnd)
: sortedArr.push(curChar)
segmentBegin = null
segmentEnd = null
}
})
return sortedArr.join(',')
}
console.time('sort')
var res = sortStr(str)
console.timeEnd('sort')
console.log(res)
function changeStr(str) {
let strArr = str.replace(' ', '').split(',');
if (strArr.length < 2) return str;
let newStr = '';
let newStrArr = [];
let arr = [strArr[0]];
for(let i = 1; i <= strArr.length; i++) {
if (strArr[i] == (parseInt(arr[arr.length - 1]) + 1)) {
arr.push(strArr[i]);
} else {
if (arr.length > 1) {
newStrArr.push('' + arr[0] + '~' + arr[arr.length - 1]);
} else {
newStrArr.push(arr[0]);
}
arr = [strArr[i]];
}
}
newStr = newStrArr.join(',');
return newStr;
}
@whyour 你这个方法在最后两位是连续的时候,结果不对。传入 '1,2,3,5,7,8' ,输出的是 1~3,5,7,8
添加~应该在else外面。😃已修改
function format(str) {
let result = [];
let arr = str.split(',').map(Number);
let tmp = [];
for (let i = 0, length = arr.length; i < length; i ++ ) {
tmp.length === 0 ? tmp[0] = tmp[1] = arr[i] : '';
if (arr[i+1] && arr[i+1] === arr[i] + 1) {
tmp[1]++
} else {
tmp[0] === tmp[1] ? result.push(tmp[0]) : result.push(tmp.join('~'));
tmp = [];
}
}
return result.join(',');
}
format('1,2,3,5,7,8,10')
// "1~3,5,7~8,10"
function transform(numStr){
let group = []
let groupSubIndex = 0
numStr.split(',').forEach(a => {
let groupLen = group.length
a = +a
if(groupLen == 0){
group.push([a])
}else{
if(a == group[groupLen-1][groupSubIndex] + 1){
group[groupLen-1].push(a)
groupSubIndex++
}else{
group.push([a])
groupSubIndex = 0
}
}
})
return group.map(v => v.length>1 ? `${v[0]}~${v[v.length-1]}` : v[0]).join(',')
}
transform('1, 2, 3, 5, 7, 8, 10')
@MoveZZG 你这个强行一行,可阅读性不行啊
function getNewStr(str) {
let arr = input.split(','),
temp,
count=0,
result = '';
arr.forEach(res => {
if (!temp) {
temp = +res;
result = res;
return
}
if (temp + count + 1 === +res) {
count++;
return
}
result += count ? `~${temp+count},${res}` : `,${res}`
temp = +res;
count = 0;
})
count&&(result+=`~${temp+count}`);
return result
}
console.log(getNewStr(input))
str
.split(',')
.map(Number)
.reduce((r,v,i,arr)=>r+(v-arr[i+1]===-1?arr[i-1]-v===-1?'':v+'~':v+','),'')
.replace(/,$/,'')
function transformStr(str) {
let s = ''
str.split(',').reduce((prev, cur, index, array) => {
let pre = index > 0 ? array[index - 1] : null;
if (pre) {
s += (+pre + 1 == cur ? '~' + cur : ',' + cur)
} else {
s += cur
}
}, '')
return s.replace(/~\d~/g, (re) => '~')
}
- 利用类似滑动串口的思想,只是可能最后边界写的不好,看起来代码有点多,欢迎指点
"use strict";
/* 第 110 题:编程题,请写一个函数,完成以下功能
输入 '1, 2, 3, 5, 7, 8, 10' 输出 '1~3, 5, 7~8, 10' */
var test = function (numList) {
var result = '';
var num = numList.split(',');
var len = num.length;
var left = 0, right = 1;
while (right < len) {
//判断数组是否延续
if (parseInt(num[right]) - parseInt(num[right - 1]) !== 1) {
if (right - left == 1) {
result += num[left] + ",";
}
else {
result += num[left] + "~" + num[right - 1] + ",";
}
left = right;
}
right++;
//右边已经大于边界了,判断窗口中还没有输出的数字
if (right >= len) {
if (right - left == 1) {
result += num[left];
}
else {
result += num[left] + "~" + num[right - 1];
}
}
}
return result;
};
console.log(test("1,2,3,5,7,8,10,11,13,15,16,66"));
function group(str_){
let result=[];
for(let arr=str_.split(','),lastI=0,isS=false,i=1,l=arr.length;i<l;i++){
if(arr[i]-arr[i-1]==1){
isS=true;
}else{
result.push(isS?[arr[lastI],'~',arr[i-1]].join(''):arr[i-1]);
lastI=i;
isS=false;
}
i==l-1&&result.push(isS?[arr[lastI],'~',arr[i]].join(''):arr[i]);//last one
}
return result;
}
//test: group('1,2,3,5,7,8,10,20,21,22,23,24,100'); //1~3,5,7~8,10,20~24,100
function doSome(str){ let arr = str.replace(/,/g,',').split(','); if( arr.length == 0 ) return ''; if( arr.length == 1 ) return arr[0]; let result = []; let temp = arr[0]; let key = temp; arr.forEach((item, index)=>{ if( index == 0 ) return; if( index == arr.length - 1 ){ result.push(key == arr[index] ?
${key}:
${key}~${arr[index]}); } if( parseInt(item) != parseInt(temp) + 1 ){ result.push(key == temp ?
${key}:
${key}~${temp}); key = item; } temp = item; }) return result.join(','); }
let str = '1, 2, 3, 5, 7, 8, 10';
let arr = str.split(', ');
let lower = arr[0];
let ans = [];
for (let i = 1; i < arr.length - 1; i++) {
if (parseInt(arr[i]) + 1 !== parseInt(arr[i + 1])) {
if (lower === arr[i]) {
ans.push(arr[i]);
} else {
ans.push(`${lower} ~ ${arr[i]}`)
}
lower = arr[i + 1]
}
}
if (lower === arr[arr.length - 1]) {
ans.push(lower);
} else {
ans.push(`${lower} ~ ${arr[arr.length - 1]}`)
}
console.log(ans.join(', '));
才发现javascript没有out of range 的检查
function func(str) {
let arr = str.split(',')
return arr.reduce((pre, cur) => {
let lastItem = pre[pre.length - 1]
let first = ""
let last = lastItem
if(!lastItem) return [...pre,cur]
// 最后一个元素是否满足 "x~y" 格式
if(lastItem.includes("~")) {
first = lastItem.split("~")[0]
last = lastItem.split("~")[1]
}
// 判断是否是连续数字
if (Number(cur) === Number(last) + 1) {
pre[pre.length - 1] = lastItem.includes("~") ? `${first}~${cur}` : `${lastItem}~${cur}`
return pre
} else {
return [...pre, cur]
}
}, [])
}
console.log(func("1,2,3,5,7,8,10"))
重在参与-。-
var num1 = '1,2,3,5,7,8,10';
function simplifyStr (str) {
var result = [];
var numArr = str.split(',').map(item => parseInt(item,10));
var tmp = numArr[0];
numArr.forEach((item,index) => {
if (numArr[index+1]!=item+1) {
if (tmp!=item) {
result.push(`${tmp}~${item}`)
} else {
result.push(`${item}`)
}
tmp = numArr[index+1];
}
})
return result.join(',');
}
console.log(simplifyStr(num1))
/*
输入:'1,2,3,5,7,8,10'
输出:'1~3,5,7~8,10'
*/
var str = '1,2,3,5,7,8,10'
function fn(str){
var arr = [];
var strArr = str.split(",").map(item => Number(item))
let temp = '';
for(var i = 0; i< strArr.length; i++) {
if(strArr[i+1] && strArr[i+1] === strArr[i] + 1) {
if(temp){
continue
} else {
temp = temp + strArr[i] + '~';
}
}else {
if(temp) {
temp = temp + strArr[i];
arr.push(temp)
temp = ''
} else {
arr.push(strArr[i]);
}
}
}
return arr.join(',')
}
console.log(fn(str)); //'1~3,5,7~8,10'
想看各位大佬的最佳操作,我就简陋的写了一下。
const nums1 = [1, 2, 3, 5, 7, 8, 10]; function simplifyStr(num) { var result = []; var temp = num[0] num.forEach((value, index) => { if (value + 1 !== num[index + 1]) { if (temp !== value) { result.push(`${temp}~${value}`) } else { result.push(`${value}`) } temp = num[index + 1] } }) return result; } console.log(simplifyStr(nums1).join(','))
这算是是动态规划吧
const transformArr = (input) => {
let output = [], start;
input.forEach((cur, idx, arr)=> {
const pre = arr[idx - 1], next = arr[idx + 1];
if(cur !== pre + 1 && cur !== next -1) {
return output.push(`${cur}`)
}
if (cur === next - 1){
if (cur !== pre + 1){
start = cur;
}
return;
}
return output.push(`${start}~${cur}`);
});
return output.join(',');
};
console.log(transformArr([1, 2, 3, 5, 7, 8, 10]))
const concat = (str) => {
const numbers = str.split(',').map(Number)
let result = []
let start = last = Number(numbers[0])
numbers.forEach(number => {
if (number-last > 1) {
result.push(last> start ? `${start}~${last}` : last)
start = last = number
}
else {
last = number
}
})
result.push(last> start ? `${start}~${last}` : last)
return result.join(', ')
}
var numberArray = [1, 2, 3, 5, 7, 8, 10];
function handle(numberArr) {
var arr = [];
for (var i in numberArr) {
arr.push({number:numberArr[i],index:numberArr[i] - parseInt(i)});
}
// console.log(arr);
arr= arr.filter( (pre, net) =>{
if (arr[net - 1] &&arr[net - 1].index === pre.index && arr[net + 1].index === pre.index) {
// 只保留2个
return false;
}
else {
return true;
}
})
let length = arr.length
for(var i =0;i< length;i++) {
if(arr[parseInt(i)+1]&&arr[parseInt(i)].index===arr[parseInt(i)+1].index) {
arr.push(`${arr[i].number}~${arr[parseInt(i)+1].number}`)
i++
} else {
arr.push(`${arr[i].number}`)
}
}
return arr.slice(length)
}
console.log(handle(numberArray));
function formatter(str) {
const arr = JSON.parse(`[${str}]`);
const result = arr.reduce((res, next) => {
const val = res.current + res.step;
if (val === next) {
res.step += 1;
} else {
res.current = next;
res.step = 1;
res.list[0].push(val - 1);
res.list = [[next], ...res.list];
}
return res;
}, { current: 1, step: 0, list: [[1]] });
return result.list.reverse().map(elem => elem.join('~')).join(',');
}
好像写了好多....
function convert() {
let res = '';
for (let i = 0; i < arr.length; i++) {
const cur = arr[i];
res += cur + (cur + 1 === arr[i + 1] ? '~' : ',');
}
let ret = '';
res.split(',').map(v => {
const arr = v.split('~');
const len = arr.length;
if (len > 1) {
ret += arr[0] + `~` + arr.pop() + ',';
} else if (arr[0]) {
ret += arr[0] + ',';
}
});
return ret;
}
function transSeq(source) {
if (!source || typeof source !== "string") return source;
var result = "";
const targetAry = source.split(",").map(i => Number(i));
var curVal = targetAry[0];
var len = targetAry.length;
for (let i = 0; i < len - 1; i++) {
let j = i + 1;
let endLoop = j === len - 1;
if (targetAry[j] - targetAry[i] > 1 || targetAry[j] - targetAry[i] < 0) {
if (curVal === targetAry[i]) {
result = result + curVal + ",";
} else {
result = result + curVal + "~" + targetAry[i] + ",";
}
curVal = targetAry[j];
if (endLoop) {
result = result + curVal;
}
} else {
if (endLoop) {
result = result + curVal + "~" + targetAry[j];
}
}
}
return result;
}
const src = "1, 2, 3, 5, 7, 8, 10, 15, 16, 17, 20,21,22,24";
console.log(transSeq(src));
写得有点丑。
function transform(str){
const arr=str.split(',').map(v=>parseInt(v));
let isserial=false,temp,result="";
console.log(arr);
for(let i in arr){
if(i==0)result+=arr[i];
else{
if(arr[i]==arr[i-1]+1){
isserial=true;
temp=arr[i];
if(i==arr.length-1)result+=`~${arr[i]}`;
}
else{
if(isserial){isserial=false;result+=`~${temp},${arr[i]}`;}
else result+=`,${arr[i]}`
}
}
}
return result;
}
let str="1,2,3,5,7,9,10,11,13,14,15,33,37,39,40,200"
console.log(transform(str))
function fn (str) {
var arr = str.split(',').map(Number)
var finalStr = ''
var first = arr[0];
var subArr = []
for (let i = 1; i < arr.length; i++) {
subArr.push(first)
if (first + 1 == arr[i]) {
subArr.push(arr[i])
first = arr[i]
} else {
if (subArr.length >= 2) {
finalStr += subArr[0] + '~' + subArr[subArr.length -1] + ', '
} else {
finalStr += subArr[0] + ', '
}
subArr = []
first = arr[i]
}
if (i == arr.length -1 ) {
finalStr += arr[i]
}
}
console.log(finalStr)
return finalStr
}
var str = '1, 2, 3, 5, 7, 8, 9, 10, 12';
fn(str);
let str = '1, 2, 3, 5, 7, 8, 10';
let foo = str => {
let arr = str.split(',').map(Number);
let subArr = arr[0]
return arr.reduce((prev,cur,index)=>{
if(cur + 1 !== arr[index + 1]) {
subArr !== cur ? prev.push(subArr+'~'+cur) : prev.push(cur)
subArr = arr[index + 1]
}
return prev
},[]).toString()
}
foo(str)
function simplify(str, hyphen = '~') {
if (str.length === 0) {
return '';
}
const arr = str.split(',');
if (!arr.every(char => Number.isInteger(+char))) {
throw new Error('invalid str, please check!');
}
const result = [];
let incrementStep = 1;
let startNumber = arr[0];
for (let i = 1, length = arr.length; i <= length - 1; i++) {
const char = arr[i];
if (char === startNumber) {
continue;
}
if (char - startNumber === incrementStep) {
incrementStep++;
} else {
const endNumber = (+startNumber) + (incrementStep - 1)
if (+startNumber !== endNumber) {
result.push(`${startNumber}${hyphen}${endNumber}`);
}
result.push(`${char}`)
incrementStep = 1;
startNumber = arr[i + 1];
}
}
return result.join(',');
}
function transform(str) {
const arr = str.split(',');
const arrLength = arr.length;
let result = '';
let isStart = true; // 将转换结果中的第一个数字与逗号后的第一个数字视为一个小节的开始
for (let i = 0; i < arrLength; i++) {
const currentValue = arr[i];
const nextValue = arr[i + 1];
if (currentValue == nextValue - 1) {
result += isStart ? `${currentValue}~` : '';
isStart && (isStart = false); // 若当前的isState不为false,则置为false
} else {
result += `${currentValue},`;
!isStart && (isStart = true); // 若当前的isState不为true,则置为true
}
}
return result.substr(0, result.length - 1); // 去除最后多余的一个逗号
}
console.log(transform('1,2,4,5,6,7,9,11,12')); // '1~2,4~7,9,11~12'
console.log(transform('1')); // '1'
console.log(transform('1,3')); // '1,3'
console.log(transform('2,3')); // '2~3'
console.log(transform('')); // ''
function handleStr(str){
if(!str.length) return ''
let arr = Array.from(new Set(str.split(',')), x => x * 1).sort((x, y) => x - y)
let res = ''
res += arr[0]
for(let i = 1, len = arr.length; i < len; i++){
if(arr[i] - arr[i - 1] === 1){
res += (arr[i + 1] - arr[i] === 1
? res[res.length - 1] === '~' ? '' : '~'
: res[res.length - 1] === '~' ? arr[i] : `~${arr[i]}`)
}else{
res += `,${arr[i]}`
}
}
return res
}
handleStr('1,3,2,7,5,8,10') // "1~3,5,7~8,10"
handleStr('1,3,2,4,7,5,8,10') // "1~5,7~8,10"
handleStr('1,3,2,7,5,8') // "1~3,5,7~8"
handleStr('') // ""
function set(arr) {
arr = arr.split(',');
let arrBak = []
let str = ''
let count = 0
for (let i = 1; i <= arr.length; i++) {
if (arr[i] - arr[i - 1] === 1) {
count++;
if (!str) {
str = arr[i - 1];
}
} else {
let currentValue = count === 0 ? arr[i - 1] : ${str}~${arr[i - 1]}
arrBak.push(currentValue)
str = arr[i]
count = 0;
}
}
return arrBak.join(',');
}
function format (str) {
let ary = str.split(',').map(item => Number(item));
let curIndex = 0,
fiAry = [];
for (let i = 0; i < ary.length; i++) {
if (ary[i] + 1 === ary[i + 1]) {
continue;
} else {
if (ary[curIndex] === ary[i]) fiAry.push(ary[i]);
else fiAry.push(`${ary[curIndex]}~${ary[i]}`);
curIndex = i + 1;
}
}
return fiAry.join(',');
}
console.log(format('1, 2, 3, 5, 7, 8, 10, 11, 13, 14, 16, 18, 20, 21'));
// 1~3,5,7~8,10~11,13~14,16,18,20~21
我也来一个
const transformStr = (str) => {
if (!str) return ''
let strToArray = str.split(',').map(val => +val).filter(val => !isNaN(val))
return strToArray.reduce((cal, curr) => {
if (cal.length) {
let lastVal = cal.pop()
if (typeof lastVal === 'number' && lastVal + 1 === curr) {
if (cal[cal.length - 1] === '~') {
cal.push(curr)
} else {
cal.push(lastVal, '~', curr)
}
} else {
cal.push(lastVal, ',', curr)
}
} else {
cal.push(curr)
}
return cal
}, []).join('')
}
const deal = (source) => {
const arr = source.split(',')
const len = arr.length
let str = ''
let arr2 = []
for (let i = 0; i < len; i++) {
if (arr[i] * 1 === arr[i + 1] * 1 - 1) {
str === '' ? str = `${arr[i]}` : null
} else {
str = str === '' ? `${arr[i]}` : `${str}~${arr[i]}`
arr2.push(str)
str = ''
}
}
return arr2;
}
const formArray = (arr: string) => {
const [first, ...sortAry] = Array.from(
new Set(arr.split(',').map(v => Number(v)))
).sort((a, b) => a - b)
let start: number = first
let end: number = first
let res: string[] = []
const getVale = (a, b) => (a === b ? `${a}` : `${a}~${b}`)
sortAry.forEach(num => {
if (num === end + 1) {
end = num
} else {
res.push(getVale(start, end))
start = end = num
}
})
res.push(getVale(start, end))
return res.join(',')
}
function change(str){
const arr = str.split(',');
const result = [];
let index = 0;
for(let i = 0,l=arr.length;i<l;i++){
const target = Number(arr[i]);
const prevArr = result[index-1]
//连续的数,放一个数组
if( prevArr&&
prevArr[prevArr.length-1]+1===target){
result[index-1].push(target)
}else{
result[index] = [target];
if(prevArr){
result[index-1] = prevArr.length>1?`${prevArr[0]}~${prevArr[prevArr.length-1]}`:prevArr[0]
}
index++;
}
}
const lastOne = result.pop();
result.push(lastOne.length>1?`${lastOne[0]}~${lastOne[lastOne.length-1]}`:lastOne[0])
return result.join(',')
}
change('1, 2, 3, 5, 7, 8, 10, 11')
const simplifyStr = (str) => {
let strArray = str.split(",")
let res = [];
strArray.forEach((s, i) => {
if (Number(s) + 1 === Number(strArray[i + 1])) {
if (res[res.length - 1] !== "~") {
res.push(s, "~")
}
} else {
res.push(s)
}
})
return res.join(",").replace(/,~,/g, "~")
}
let str = '1,2,3,5,7,8,10';
function test(input) {
return input.split(',').reduce((c, n) => {
return +c[c.length - 1] + 1 === +n ? `${c}~${n}` : `${c},${n}`
}).replace(/(~\d+)+~/g, '~');
}
console.info(test(str));
function fn(arr) { const len = arr.length; const result = [];
let i = 0, pos = 0;
while (i < len) {
if (arr[i] + 1 !== arr[i+1]) {
if (pos !== i) {
result.push(`${arr[pos]}~${arr[i]}`);
} else {
result.push(`${arr[pos]}`);
}
pos = i + 1;
}
i++;
}
return result;
}
const trans = (str) => {
const arr = str.split(',').concat(undefined);
let start = Number(arr[0]);
let gap = 1;
let temp = '';
let result = [];
for(let i=1;i<arr.length;i++){
let cur = Number(arr[i]);
if(cur === start+gap){
gap++
temp = start + '~' + cur
}else{
result.push(temp);
start = cur;
temp = cur;
gap = 1;
}
}
console.log(result.join(','))
}
function fn(arr) {
let res = [arr[0]];
for (let i = 0, j = 1; i < arr.length - 1; ++i, ++j) {
if (arr[j] - arr[i] > 1) {
let resEnd = res[res.length - 1]
if (resEnd != arr[i]) res[res.length - 1] += (arr[i] + '')
res.push(arr[j] + '')
} else {
let resEnd = res[res.length - 1]
if (resEnd[resEnd.length - 1] !== '~') res[res.length - 1] += '~'
}
}
if (res[res.length - 1].substr(-1) == '~') {
res[res.length - 1] += arr[arr.length - 1]
}
return res;
}
let arr = [1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 14];
console.log(fn(arr)); //[ '1~4', '6~12', '14' ]
const items = str.split(', '); const array = str.split(', ');
let string = [];
const fn = () => {
for (let i = 0; i < array.length; i++) {
if (array[i] % 5 === 0) {
const arr = items.splice(0, i + 1);
string.push(${arr[0]}~${arr[arr.length - 2]}
);
string.push(arr[arr.length - 1]);
}
}
return string.join(', ');
}
console.log('string', fn());
'1,2,3,5,7,8,10'.split(',').reduce((p,n)=>{
let last = p.slice(-1)[0];
last && +last.slice(-1)[0] + 1 == n ? last.push(n) : p.push([n]);
return p;
},[]).map(a=>a.length > 1 ? a.shift() + '~' + a.pop() : a[0]).join(',')
双指针,减少数组操作
function findSeries (str){
let ret = '';
let pl = 0;
let pr = 1;
let arr = str.split(',');// [1,2,4,5,6,8,9]
let len = arr.length;
while(pr<len && pl<len){
while(arr[pr]-0 === arr[pr-1]-0+1){
pr++;
}
if(pr-pl > 1){
ret+=`,${arr[pl]}~${arr[pr-1]}`;
}
else {
ret+=`,${arr[pr]}`
}
pl = pr;
pr++;
}
return ret.slice(1, ret.length);
}
function getRes(str) {
let arr = str.split(',').map(item => Number(item))
let res = [[arr[0]]]
for (let i = 1; i < arr.length; i++) {
let cur = arr[i]
let lastArr = res[res.length - 1]
console.log(cur, lastArr[lastArr.length - 1], 'kevinnnnnn')
if (cur == lastArr[lastArr.length - 1] + 1) {
lastArr.push(cur)
} else {
res.push([cur])
}
}
return res.map(item => item.length > 1 ? `${item[0]}~${item[item.length - 1]}` : item[0]).join(',')
}
const fn = (str) => {
if (!str || str.length === 0) {
return str;
}
const strArr = str.split(',').map((n) => Number(n));
const len = strArr.length;
const arr = [[strArr[0]]];
let i = 1;
while (i < len) {
const cur = strArr[i];
const last = strArr[i - 1];
if (cur === last + 1) {
arr[arr.length - 1].push(cur);
} else {
arr.push([cur]);
}
i += 1;
}
for (let i = 0; i < arr.length; i += 1) {
if (arr[i].length > 1) {
arr[i] = `${arr[i][0]}~${arr[i][arr[i].length - 1]}`;
} else {
arr[i] = arr[i][0];
}
}
return arr.join(',');
};
const str = '1,2';
console.log(fn(str));
思路:使用双指针
let arr = [1, 2, 3, 5, 7, 8, 10, 11, 12];
// 找出数组中的连续数字
function findSeries(arr) {
let i = 0, j = 1;
let result = [];
while (i < arr.length) {
// 用j来搜寻连续数字,一旦发现不连续了或越界就会停下来
while (j < arr.length && arr[j] - arr[j - 1] === 1) j++;
// 停下来后j未越界
if (j < arr.length) {
result.push(i === j - 1 ? `${arr[i]}` : `${arr[i]}~${arr[j - 1]}`);
i = j;
j += 1;
} else {
// 停下来后j越界
j = arr.length;
result.push(i === j - 1 ? `${arr[i]}` : `${arr[i]}~${arr[j - 1]}`);
break;
}
}
return result;
}
console.log(findSeries(arr)); // [ '1~3', '5', '7~8', '10~12' ]
function foo(arr){
let temp = []
let res = []
arr.forEach((e,i,array) => {
temp.push(e)
if(i === array.length-1 || e + 1 !== array[i+1]){
if (temp.length === 1){
res.push(temp[0])
} else {
res.push(temp[0]+'~'+temp[temp.length-1])
}
temp = []
}
});
console.log(res)
return res
}
向temp里加入连续的数字 如果是最后一位或者不是连续的就清算temp
简单写了个答案
const nums1 = [1, 2, 3, 5, 7, 8, 10];
function simplifyStr(arr) {
if (arr.length === 0) return
let res = []
let first = last = arr[0]
for (let i = 0; i < arr.length ; i++) {
last ++
if (last !== arr[i + 1] && last - 1 !== first) {
res.push(`${first}~${arr[i]}`)
last = first = arr[i + 1]
}else if(last !== arr[i + 1] && last - 1 === first){
res.push(`${first}`)
last = first = arr[i + 1]
}else{
}
}
return res
}
console.log(simplifyStr(nums1).join(','))
var changeNumStr = function (str) {
var arr = str.split(', ');
return (arr.reduce(function (pre, item) {
var val = +item;
if (pre.last === undefined || pre.last + 1 !== val) {
pre.start = val;
pre.save.push(val);
}
else {
pre.save[pre.save.length - 1] = pre.start + '~' + val;
}
pre.last = val;
return pre;
}, { save: [], last: undefined, start: undefined })).save.join(', ');
};
console.log(changeNumStr('1, 2, 3, 5, 7, 8, 10'));
console.log(changeNumStr('1, 2, 3, 4, 7, 9, 10'));
let str = '1,2,3,5,7,8,6,10'
let arr = str.split(',')
let left = 0
let grap = 1 // 间隔值
let result = ''
for (let i = 0; i < arr.length; i++) {
let right = i + 1
let itemLeft = arr[left]
let itemCurrent = arr[i]
let itemRight = arr[right]
let hasComma = i !== arr.length - 1 ? ',' : ''
if (itemRight - itemCurrent !== grap) {
result += left === i ? `${itemCurrent}${hasComma}` : `${itemLeft}~${itemCurrent}${hasComma}`
left = right
}
}
console.log('result: ', result)
输入
1, 2, 3, 5, 7, 8, 10
输出
1~3, 5, 7~8, 10
/* 把连续的值放进数组中,然后把这些数组变成字符串 1~3 这种 */
const nums1 = [1, 2, 3, 5, 7, 8, 10]; // ==> 1~3,5,7~8
const simplifyStr = (arr) => {
arr = arr.concat(Infinity)
let tempArr = []
let result = []
arr.reduce((res, cur) => {
res && tempArr.push(res)
if (cur - res > 1) {
result.push(tempArr.length === 1 ? tempArr.toString() : tempArr)
tempArr = []
}
return cur
})
console.log(result)
return result.reduce((res, cur) => {
!Array.isArray(cur) ? res.push(cur) : res.push(cur.join(',').replace(/^(.)(.*?)(.)$/,
"$1~$3")) // 正则去除首尾
return res
}, []).join(',')
}
console.log(simplifyStr(nums1))
function reform(str) {
let count = 0;
const result = []
const numarr = str.split(',').map(Number)
numarr.forEach((value,index) => {
if(index == 0) {
result[count] = []
result[count].push(value)
} else {
if(value == numarr[index - 1] + 1) {
result[count].push(value)
} else {
count += 1
result[count] = []
result[count].push(value)
}
}
})
let simplystr = ''
result.forEach(value => {
if(value.length > 1) {
simplystr += `${value[0]}~${value[value.length - 1]},`
} else {
simplystr += `${value[0]},`
}
})
return simplystr.substr(0,simplystr.length - 1)
}
console.log(reform('1,2,3,5,7,8,10,12,15,20,1,2'))
比较粗暴
continuity('1,2,3,5,7,8,10,11,12,13,15')
function continuity(str) {
let arr = str.split(',')
let result = ''
let start = arr[0]
let last = ''
add(0,1)
function add(num1,num2) {
if (Number(arr[num1]) + 1 != arr[num2]) {
last = arr[num1]
if (start == last ){
result = result +','+last
} else {
result = result +',' + start + '~' + last
}
start = arr[num1+1]
}
if (num2 < arr.length){
add(num2, num2 + 1)
}
}
console.log(result.substring(1));
}
/*
* @Date: 2020-01-28 14:03:47
* @LastEditTime : 2020-01-28 17:53:56
* @Description: 输入 '1, 2, 3, 3, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 110, 111, 112' 输出 '1~3,5~9,11~15,110~112'
*/
const str = '1, 2, 3, 3, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 110, 111, 112';
// 格式化数据
const trimStr = [...new Set(str.split(',').map(x => x.trim()))].join(',');
let result = [];
const change = str => {
let arr = str.split(','),
i = arr[0],
num = 0;
while (num < arr.length) {
i++, num++;
if (i != arr[num] && arr[num] && arr[num] !== arr[arr.length - 1]) {
let res = str.match(new RegExp(`.*(?=,${arr[num]},)`))[0].split(',').filter(x => x);
res.length > 1 ? result.push(`${res[0]}~${res[res.length - 1]}`) : result.push(`${res}`);
return change(str.match(new RegExp(`(?=${arr[num]},).*`))[0]);
} else if (i != arr[num] && arr[num] == arr[arr.length - 1]) {
let res = str.match(new RegExp(`.*(?=,${arr[num]})`))[0].split(',').filter(x => x);
res.length > 1 ? result.push(`${res[0]}~${res[res.length - 1]}, ${arr[num]}`) : result.push(`${res}, ${arr[num]}`);
} else if (arr[num] == arr[arr.length - 1]) {
let res = str.split(',');
result.push(`${res[0]}~${res[res.length - 1]}`);
}
}
};
change(trimStr);
console.log(result.join());
实现的挺水的,但思路很简单
function foo(str) {
//转数字方便比较,使用result存新字符串,subs存当前连续子序列
str = str.split(',').map(value => Number(value));
let result = [];
subs = str[0];
for(let i = 1;i < str.length;i++){
//判断是否连续
if(str[i] === str[i-1] + 1){
subs += '#' + str[i];
if(i === str.length-1) result.push(subs.split('#').shift() + '~' + subs.split('#').pop())
}else{
if(subs.length > 1) result.push(subs.split('#').shift() + '~' + subs.split('#').pop());
else result.push(subs);
subs = String(str[i]);
if(i === str.length-1) result.push(subs)
}
}
return String(result);
}
双指针:
function renderSerial(...nums) {
let res = [];
let i = 0;
let j = 1;
while (j < nums.length) {
if (nums[j] - nums[j - 1] !== 1) {
res.push(i === j - 1 ? nums[i] : nums[i] + '~' + nums[j - 1]);
i = j;
}
j++;
}
// 尾部处理
res.push(i === j - 1 ? nums[i] : nums[i] + '~' + nums[j - 1]);
return res.join(', ');
}
// 按原来的顺序,把所有连续的元素放到一个个小数组里。然后再扁平化
var arr = [1, 3, 4, 5, 7, 8, 10, 11, 12];
trans(arr);
function trans(list) {
var continuous = [[String(list[0])]];
var index = 0;
var res = [];
for (var i = 0; i < list.length - 1; i ++) {
if (list[i + 1] == list[i] + 1) {
continuous[index].push(String(list[i + 1]));
} else {
index ++;
continuous[index] = [String(list[i + 1])];
}
}
for (var k in continuous) {
if (continuous[k].length > 2) {
continuous[k] = continuous[k][0] + '~' + continuous[k][continuous[k].length - 1];
}
res = res.concat(continuous[k]);
}
console.log('res: ', res); // ["1", "3~5", "7", "8", "10~12"]
}
const a = '1, 2, 3, 5, 7, 8, 10'
function bar(str) { const strList = str.split(', ') let start = strList[0] let result = []
for(let i = 0; i < strList.length; i++) { let end = strList[i] let next = strList[i + 1]
if(parseInt(end) + 1 !== parseInt(next)) {
if(start === end) {
result.push(`${start}`)
} else {
result.push( `${start}~${end}`)
}
start = next
}
}
return result.join(', ') }
console.log(bar(a)) // 1~3, 5, 7~8, 10
str = '1,2,3,5,7,8,10'
function f(str){
const strArray = str.split(',')
let i=0
let j=0
let current = strArray[0]
let next = strArray[0]
let result = []
while(i < strArray.length && j < strArray.length){
current = strArray[i]
j++
if(Number(next) + 1 !== Number(strArray[j])){
if(i===j-1){
result.push(`${current}`)
}else{
result.push(`${current}~${strArray[j-1]}`)
}
i = j
}
next = strArray[j]
}
return result.join(',')
}
f(str)
`
function out(str){
let res = str.trim().split(/,\s+/), ans = []
for (let i = 0; i < res.length; i++) {
let j = i
while(res[i + 1] - res[i] == 1) i++
ans.push(j == i ? res[i] : `${res[j]}~${res[i]}`)
}
return ans .join(', ')
}
`
const getMax = (str) => {
let beginItem = "",endItem = 0,out = [];
str.split(",").concat("t").reduce((l,n)=>{
n - l == 1 ? endItem = n : (function(){
endItem - beginItem > 0 ? out.push(`${beginItem}~${endItem}`) : out.push(beginItem);
beginItem = n;
})();
return n;
},"t");
out.shift();
return out.join();
}
const input = '1, 2, 3, 5, 7, 8, 10';
function change(str) {
let inputArray = str.split(',');
let res = [];
let i = 0, j = 0
while (i < inputArray.length) {
let start = inputArray[i];
let pre = start, end;
j = i + 1;
while (Number(inputArray[j]) === Number(pre) + 1) {
pre = inputArray[j];
j++;
}
end = inputArray[j - 1];
if (start == end) {
res.push(start);
}
else {
res.push(start + "~" + end);
}
i = j;
}
return res.join(',')
}
console.log(change(input))