题目一 将数据流变为多个不相交的区间
<script>
var SummaryRanges = function() {
this.num = [];
};
SummaryRanges.prototype.addNum = function(val) {
if(this.num.includes(val)){ //已存在
return;
}
//新元素,push并且排序
this.num.push(val);
this.num.sort((a,b)=>a-b);
};
SummaryRanges.prototype.getIntervals = function() { //获得区间
let arr = []; //区间数组
if(this.num.length === 0){
return arr;
}
for(let i=0;i<this.num.length;i++){ //num是排序好的数组,新进入的值,一定是加入右边的
let curNum = this.num[i];
if(arr.length === 0){ //区间数组为空,存进去第一个值
arr.push([curNum,curNum])
}else{ //区间数组中已有,进行判断(第一项一定是最小的那个)
let lastNum = arr[arr.length-1][1]; //目前最右区间的末尾值
if(lastNum+1 === curNum){ //连续的
arr[arr.length-1][1] = curNum; //更新区间的末尾值
}
else { //不连续的
arr.push([curNum,curNum]); //直接存入一个区间
}
}
}
return arr;
};
</script>
题目二 使用最小花费爬楼梯
<script>
let cost=[1, 100, 1, 1, 1, 100, 1, 1, 100, 1];
//找出第i步的最小花费,则i+1的最小花费就是i加上i+1或者i-1加上i+1
//cost长度范围是[2,1000],不需要考虑一个台阶
var minCostClimbingStairs = function(cost) {
cost.push(0); //往末尾添加一个0.到达顶层
cost.unshift(0); //往头部也加一个0. 这样判断位置就可以直接i-1 和 i-2 的判断了
let costSum = [0,cost[1]]; //每一步的最小花费
for(let i=2;i<cost.length;i++){ //头部有一个0
//cost是目前楼梯要的花费,costSum中存储了,前面每一个楼梯的最小花费
let temp = Math.min(cost[i]+costSum[i-1],cost[i]+costSum[i-2]); //1+1的走法和直接2的走法
costSum.push(temp); //存储目前楼梯的最小花费
}
console.log(costSum);
return costSum[costSum.length-1]; //取出最后一个值
};
console.log(minCostClimbingStairs(cost));
</script>