Daily-Interview-Question icon indicating copy to clipboard operation
Daily-Interview-Question copied to clipboard

第 110 题:编程题,请写一个函数,完成以下功能

Open flyfox11 opened this issue 4 years ago • 131 comments

输入 image 输出 image

flyfox11 avatar Jul 19 '19 04:07 flyfox11

@lonycc 朋友,你明显理解错了,这道题的意思是:如果连续数字的话,就取连续的第一个数和最后一个数,中间用~隔开。如果不连续就用,隔开。

flyfox11 avatar Jul 20 '19 05:07 flyfox11

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
  })
}

lhyt avatar Jul 20 '19 13:07 lhyt

想看各位大佬的最佳操作,我就简陋的写了一下。

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(','))

Yxiuchao avatar Jul 21 '19 01:07 Yxiuchao

我也来参与一下~

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))

flyfox11 avatar Jul 21 '19 05:07 flyfox11

@lhyt 大佬,你的方法运行的结果,最后会多个逗号。。

huzhifu avatar Jul 21 '19 06:07 huzhifu

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));

whyour avatar Jul 21 '19 14:07 whyour

哈哈,还在疑惑呢,题目是啥意思,原来是markdown中两个~构成了删除线,要用\~来写~呢

leemotive avatar Jul 22 '19 02:07 leemotive

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
}

huajianduzhuo avatar Jul 22 '19 02:07 huajianduzhuo

@whyour 你这个方法在最后两位是连续的时候,结果不对。传入 '1,2,3,5,7,8' ,输出的是 1~3,5,7,8

huajianduzhuo avatar Jul 22 '19 02:07 huajianduzhuo

const str = '1,2,3,5,7,8,10;

const transformStr = ( str ) => '1~3,5,7~8,10';

😈😈😈😈😈😈😈

Vibing avatar Jul 22 '19 02:07 Vibing

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);

lml28043 avatar Jul 22 '19 02:07 lml28043

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;}

xiaohei007 avatar Jul 22 '19 02:07 xiaohei007

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

k-0311 avatar Jul 22 '19 02:07 k-0311

这种好像用bitmap也很好处理

cisen avatar Jul 22 '19 02:07 cisen

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'))

rocketsbigfan avatar Jul 22 '19 02:07 rocketsbigfan

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));

harryliuy avatar Jul 22 '19 03:07 harryliuy

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"

suguoyao avatar Jul 22 '19 03:07 suguoyao

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(',')
}

lvwxx avatar Jul 22 '19 03:07 lvwxx

// 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);

ghost2113 avatar Jul 22 '19 03:07 ghost2113

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(',')));

求大佬们点评

Sean-lxy avatar Jul 22 '19 03:07 Sean-lxy

测试通过

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(',')
}

zwmmm avatar Jul 22 '19 03:07 zwmmm

一行代码(嘿嘿)

修改了重名变量,方便理解

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, '~')
}

MoveZZG avatar Jul 22 '19 03:07 MoveZZG


      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

weiweixuan avatar Jul 22 '19 04:07 weiweixuan

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)

kaykie avatar Jul 22 '19 05:07 kaykie

    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())

hlubing avatar Jul 22 '19 05:07 hlubing

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')

maosm avatar Jul 22 '19 06:07 maosm

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(',')
}

hhhluke avatar Jul 22 '19 06:07 hhhluke

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(',')
}

J-DuYa avatar Jul 22 '19 06:07 J-DuYa

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(",");
}

Txllmz avatar Jul 22 '19 07:07 Txllmz

//  三种情况
// 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
      }
    }
  })
}

YYJay avatar Jul 22 '19 08:07 YYJay

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))

pre1ude avatar Jul 22 '19 08:07 pre1ude

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

luhaifeng666 avatar Jul 22 '19 08:07 luhaifeng666

看起来很容易,实则很耗工夫的一道题;可能是我菜!!! 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');

630268501 avatar Jul 22 '19 08:07 630268501

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"

magicds avatar Jul 22 '19 09:07 magicds

		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]

EnergySUD avatar Jul 22 '19 09:07 EnergySUD

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; }

chuan602 avatar Jul 22 '19 10:07 chuan602

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

不知道这个方法是否可行?

chenweihuan avatar Jul 22 '19 11:07 chenweihuan

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)

willltns avatar Jul 22 '19 11:07 willltns

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;
}

Vera1128 avatar Jul 22 '19 12:07 Vera1128

@whyour 你这个方法在最后两位是连续的时候,结果不对。传入 '1,2,3,5,7,8' ,输出的是 1~3,5,7,8

添加~应该在else外面。😃已修改

whyour avatar Jul 22 '19 14:07 whyour

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"

niexia avatar Jul 23 '19 02:07 niexia

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')

damonAcc avatar Jul 23 '19 02:07 damonAcc

@MoveZZG 你这个强行一行,可阅读性不行啊

suguoyao avatar Jul 23 '19 03:07 suguoyao

      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))

zaqvil avatar Jul 23 '19 04:07 zaqvil

str
.split(',')
.map(Number)
.reduce((r,v,i,arr)=>r+(v-arr[i+1]===-1?arr[i-1]-v===-1?'':v+'~':v+','),'')
.replace(/,$/,'')

wqvbwang avatar Jul 23 '19 06:07 wqvbwang

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) => '~')

}

SherryJiang1130 avatar Jul 23 '19 06:07 SherryJiang1130

  • 利用类似滑动串口的思想,只是可能最后边界写的不好,看起来代码有点多,欢迎指点
"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"));

ibwei avatar Jul 23 '19 08:07 ibwei

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

kunogi avatar Jul 23 '19 08:07 kunogi

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(','); }

ChaoshengZhang avatar Jul 23 '19 09:07 ChaoshengZhang

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 的检查

leon0707 avatar Jul 23 '19 16:07 leon0707

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"))

重在参与-。-

yeyan1996 avatar Jul 24 '19 02:07 yeyan1996

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))

zhoushaw avatar Jul 24 '19 02:07 zhoushaw

    /*
    输入:'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'

GuoYuFu123 avatar Jul 24 '19 03:07 GuoYuFu123

想看各位大佬的最佳操作,我就简陋的写了一下。

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(','))

这算是是动态规划吧

Yangzhedi avatar Jul 24 '19 09:07 Yangzhedi

    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]))

MinoLee19 avatar Jul 24 '19 10:07 MinoLee19

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(', ')
}

pzjzeason avatar Jul 24 '19 13:07 pzjzeason

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));

RexYao97 avatar Jul 24 '19 14:07 RexYao97

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(',');
}

HEAVEN4499 avatar Jul 25 '19 03:07 HEAVEN4499

好像写了好多....

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;
}

bWhirring avatar Jul 25 '19 10:07 bWhirring

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));

hoomjac avatar Jul 25 '19 16:07 hoomjac

写得有点丑。

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))

stickleofighter avatar Jul 26 '19 04:07 stickleofighter

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);

sakz avatar Jul 26 '19 11:07 sakz

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)

Earllam avatar Jul 26 '19 12:07 Earllam

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(',');
}

negativeentropy9 avatar Jul 27 '19 11:07 negativeentropy9

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('')); // ''

lishu97 avatar Jul 29 '19 08:07 lishu97

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('') // ""

fxss5201 avatar Jul 31 '19 03:07 fxss5201

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(','); }

Wciel avatar Jul 31 '19 08:07 Wciel

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

dingLeiOnly avatar Aug 06 '19 03:08 dingLeiOnly

我也来一个

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('')
}

arnoldlynndeng avatar Aug 06 '19 08:08 arnoldlynndeng

  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;
        }

moorain avatar Aug 07 '19 15:08 moorain

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(',')
}

theWorkFsz avatar Aug 12 '19 10:08 theWorkFsz

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')

helloyoucan avatar Aug 14 '19 09:08 helloyoucan

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, "~")
  }
    

0425liu avatar Aug 20 '19 02:08 0425liu

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));

zjkblade avatar Aug 20 '19 05:08 zjkblade

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;

}

yinzuowen avatar Aug 22 '19 01:08 yinzuowen


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(','))
}

leonwens avatar Aug 27 '19 14:08 leonwens

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' ]

DarthVaderrr avatar Aug 30 '19 03:08 DarthVaderrr

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());

xiesuhui avatar Aug 31 '19 02:08 xiesuhui

'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(',')

wubetter avatar Sep 18 '19 10:09 wubetter

双指针,减少数组操作

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);
}

lzxxxxx avatar Oct 11 '19 08:10 lzxxxxx


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(',')
  }



aeolusheath avatar Oct 23 '19 13:10 aeolusheath

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));

zheiyi avatar Nov 01 '19 02:11 zheiyi

思路:使用双指针

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' ]

kite3 avatar Nov 05 '19 08:11 kite3

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

happycaroline avatar Nov 12 '19 07:11 happycaroline

简单写了个答案

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(','))

yusonghuilife avatar Nov 22 '19 03:11 yusonghuilife

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'));

maginapp avatar Nov 28 '19 09:11 maginapp

  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)

gauseen avatar Nov 29 '19 04:11 gauseen

输入

1, 2, 3, 5, 7, 8, 10

输出

1~3, 5, 7~8, 10

yygmind avatar Dec 16 '19 03:12 yygmind

  /* 把连续的值放进数组中,然后把这些数组变成字符串 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))

404cat avatar Dec 24 '19 07:12 404cat

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'))

bbrucechen avatar Dec 30 '19 06:12 bbrucechen

比较粗暴

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));
}

SSSSSFFFFF avatar Jan 16 '20 03:01 SSSSSFFFFF

/*
 * @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());

yaodongyi avatar Jan 28 '20 09:01 yaodongyi

实现的挺水的,但思路很简单

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);
}

wangyangzero avatar Mar 03 '20 06:03 wangyangzero

双指针:

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(', ');
}

whosesmile avatar Mar 16 '20 09:03 whosesmile

// 按原来的顺序,把所有连续的元素放到一个个小数组里。然后再扁平化
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"]
}

1368725603 avatar Apr 16 '20 10:04 1368725603

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

yangjiedage avatar Apr 30 '20 05:04 yangjiedage

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)

aitexiaoy avatar May 13 '20 14:05 aitexiaoy

`

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(', ')
}

`

zhengybo avatar Jun 19 '20 14:06 zhengybo

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();
}

trymoremore avatar Jun 24 '20 07:06 trymoremore


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))

yuanxiang1990 avatar Jul 12 '20 08:07 yuanxiang1990