Leetcode盛最多水的容器函数因console.log()输出异常求助
问题原因:console.log影响输出的真相
这是JavaScript中if语句缺少大括号导致的执行逻辑歧义,和console.log本身无关,只是它的存在改变了代码块的归属:
核心错误点
你的第一个if判断语句:
if((height[i]>highestBar||height[j]>highestBar)&&((i-j)>biggestGap))
后面没有加{},JavaScript的规则是:无大括号的if语句只会执行紧跟的第一行代码,后续代码不属于该if的执行范围。
两种情况的逻辑差异
保留console.log时
console.log('enter');是if的唯一执行体,后面的两个if块是独立的,每次循环都会执行。此时temp会被正常赋值,maxAmt能正确计算出最大值2。注释console.log时
紧跟if的第一行代码变成了if(height[j]<=height[i]){...},这整段代码被纳入外层if的执行范围——只有外层if条件满足时,才会计算temp并更新maxAmt。而当外层if不满足时,temp未被初始化(值为undefined),此时if(maxAmt<temp)的比较结果为false,maxAmt无法得到正确更新,最终输出错误值1。
修复方案
给外层if加上大括号,明确指定执行块的范围:
let c = [1,2,1] var myFunc = function(height) { let maxAmt=0 let temp let highestBar = -1 let biggestGap = -1 for (let i = height.length-1;i>=0;i--){ for(let j = i-1;j>=0;j--){ // 加上大括号,明确执行范围 if((height[i]>highestBar||height[j]>highestBar)&&((i-j)>biggestGap)){ // console.log('enter'); if(height[j]<=height[i]){ temp=height[j]*(i-j) } else if(height[j]>=height[i]){ temp=height[i]*(i-j) } if(maxAmt<temp){ maxAmt = temp highestBar = Math.sqrt(maxAmt) biggestGap = i-j } } } } console.log('max is '+maxAmt); return maxAmt }; console.log(myFunc(c))
额外提醒
写JavaScript代码时,无论if块内只有一行还是多行,都建议加上大括号,避免这种因代码缩进产生的逻辑歧义,这是很常见的低级错误,但容易被忽略。
内容的提问来源于stack exchange,提问作者Coolcat
相关产品推荐
相关产品推荐

