1.给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
function isValid( s ) {
// write code here
let stack = []
for(let i=0;i<s.length;i++){
if(s[i] == '('){
stack.push(')')
}else if(s[i] == '{'){
stack.push('}')
}else if(s[i] == '['){
stack.push(']')
}else if(!stack.length || stack.pop() !== s[i]){
return false
}
}
return !stack.length
}
2.找出数组中出现次数超过一半的数
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
1.先使用快速排序进行排序,然后直接访问下标为n/2的值,就是这个出现的值。时间复杂度为O(nlgn)
2.每次取出两个不同的数,剩下的数字中重复出现的数字肯定比其他数字多,将规模缩小化。如果每次删除两个不同的数(不管包括不包括最高频数),那么在剩余的数字里,原最高频数出现的频率一样超过了50%,不断重复这个过程,最后剩下的将全是同样的数字,即最高频数。此算法避免了排序,时间复杂度只有O(n),空间复杂度为O(1)。
function findMostData(arr) {
var findNum = 0
var count = 0
for(var i=0;i<arr.length;i++){
if(count === 0){
findNum = arr[i]
count = 1
}else{
if(findNum != arr[i]){
count++
}else{
count--
}
}
}
return findNum
}
3.实现二分查找算法
function binary_search(arr, key) {
var low = 0,
high = arr.length - 1;
while (low <= high) {
var mid = parseInt((high + low) / 2);
if (key == arr[mid]) {
return mid;
} else if (key > arr[mid]) {
low = mid + 1;
} else if (key < arr[mid]) {
high = mid - 1;
} else {
return -1;
}
}
}
4.给定输入两个数组,表示的是两个十进制的整数,现要求把这两个整数相加返回一个新的数组。(假设数组可以非常长,不可能通过把他们变成整数再相加,因为大整数相加会溢出)
例如:输入[1 , 4, 3] [8 , 7 , 4]
输出:[1,0,1,7]
function sumArr(arr1,arr2){
var res = []
var jin = false
while(arr1.length && arr2.length){
var num1 = arr1.pop()
var num2 = arr2.pop()
var sum = num1 + num2
if(jin){
sum += 1
jin = false
}
if(sum >=10){
res.unshift(sum % 10)
jin = true
}else{
res.unshift(sum)
}
}
var tempArr = arr1.length > 0 ? arr1 : arr2
while(tempArr.length){
var cur = tempArr.pop()
if(jin){
cur += 1
jin = false
}
if(cur === 10){
jin = true
res.unshift(0)
}else{
res.unshift(cur)
}
}
if(jin){
res.unshift(1)
}
return res
}
var a = [1 ,4 ,3]
var b = [9,9,8 ,6 ,4]
console.log(sumArr(a,b)) //[ 1, 0, 0, 0, 0, 7 ]