一、发现问题
力扣844. 比较含退格的字符串
给定
s和t两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回true。#代表退格字符。注意: 如果对空文本输入退格字符,文本继续为空。
在本题中,我选择分别遍历s、t两个字符串,
若当前字符串不为#,就把字符压入数组中,
若当前字符串为#,就从数组中弹出一个字符,
最后比较两个数组的结果是否相等。
以下为原错误解法:
var backspaceCompare = function(s, t) {
return (output(s) == output(t))//判断两个数组是否相等(错误方法)
};
var output = function(k){
let arr=[];
let i=0;
while(i<=k.length-1){
if(k.charAt(i) !== '#'){
arr.push(k.charAt(i));
i++;
}else{
arr.pop();
i++;
}
}
return arr;
}
测试用例时发现,数组相等,但利用===判断为false
var s = "ac#d"
var t = "ab#d"
console.log(output(s)) //['a', 'd']
console.log(output(t)) //['a', 'd']
console.log(backspaceCompare("ac#d","ab#d")) //false
查询后发现问题如下:
JavaScript里面Array是对象,==或===操作符只能比较两个对象是否是同一个实例,即是否是同一个对象引用。
二、解决问题
判断数组是否相等的方法:
1.简易版:转化为字符串再进行判断。
var a = ['1','2','3']
var b = ['1','2','3']
console.log(a.toString()) //1,2,3
console.log(b.toString()) //1,2,3
console.log(a.toString() === b.toString()) //true
缺点:
1.当数组元素相同,但顺序不同时,判断为false;
var a = ['1','2','3']
var b = ['1','3','2']
console.log(a.toString()) //1,2,3
console.log(b.toString()) //1,3,2
console.log(a.toString() === b.toString()) //false
2.某些特殊情况,如将数字转化为字符串,会判断为true。
var a = [1,2,3]
var b = ['1','2','3']
console.log(a.toString()) //1,2,3
console.log(b.toString()) //1,2,3
console.log(a.toString() === b.toString()) //true
2.进化版
将数组排序后,再转化为字符串,最后进行判断。
var a = [3,2,1]
var b = [1,2,3]
console.log(a.sort().toString()) //1,2,3
console.log(b.sort().toString()) //1,2,3
console.log(a.sort().toString() === b.sort().toString()) //true
3.再进化版
将数组内元素逐个比较
适用于数组内的元素非object类型。
function arrayEqual(a, b) {
//先将数组排序
a = a.sort();
b = b.sort();
//判断数组长度是否相等,若不相等返回false
if (a.length != b.length)
return false;
//逐个比较数组元素
for (var i = 0; i < a.length; ++i) {
if (a[i] !== b[i])
return false;
}
return true;
}
var a = [3,2,1]
var b = [1,2,3]
var c = ['3','2','1']
console.log(arrayEqual(a,b)) //true
console.log(arrayEqual(a,c)) //false