刷题记录:剑指offer+遇到的笔试题+LeetCode

672 阅读5分钟

加油鸭!

先总结一下数组的方法

1.concat() 方法用于连接两个或多个数组。

该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。

2.join() 方法用于把数组中的所有元素放入一个字符串,元素是通过指定的分隔符进行分隔的。

3.pop() 方法用于删除并返回数组的最后一个元素。

4.push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。

5.split() 方法用于把一个字符串分割成字符串数组。

6.reverse() 方法用于颠倒数组中元素的顺序。

7.splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

8.shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。

10.unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。

9.slice() 方法可从已有的数组中返回选定的元素。

11.toString() 方法可把一个逻辑值转换为字符串,并返回结果。

12.sort() 方法用于对数组的元素进行排序。注意!数组在原数组上进行排序,不生成副本。 如果调用该方法时没有使用参数,将按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。

注释:该方法会改变原始数组。

2019/3/8 CVTE 一面

题目:leetcode第九题回文

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

var isPalindrome = function(x) {
    return x.toString() === x.toString().split('').reverse().join('');
};//先将数值用tostring转为字符串,再用split()方法将字符串分割成数组
  // 用reverse()颠倒顺序,join()来重新组合,最后判断是否相等就行了

如果是回文字母的话

最简单的实现

 function palindrome(str) {
        var arr = str.split('');
        var arr1 = arr.reverse();
        var arr2 = arr1.join('');
        if(str == arr2){
            console.log(true);
        }else {
            console.log(false);
        }
    }
    palindrome("abba");

如果要考虑到非字符的因素

function palindrome(str) {
        var newStr= str.replace(/\W+/g,'');//匹配所有非单词的字符,替换为空字符串
        newStr= newStr.replace(/\_+/g,'');//匹配所有下划线,替换为空字符串
        newStr=newStr.toLowerCase();
        //转化字符串为小写
        var arr1= newStr.split('');
        var arr2=arr1.reverse();
        var newStr2=arr2.join('');
        //重构倒序的字符串
        if(newStr == newStr2){//比较1
            console.log(true);
        }else{
           console.log(false);
        }
    }
    palindrome("abba");

2019/3/15 北森测评编程题

找出数组中重复出现的数字生成一个新的数组并对数组从小到大排序

function duplicates(arr) {
    var newArr=[];
    arr.sort();
    console.log(arr);
    for(var i =0;i<arr.length;i++){
        if(arr[i]==arr[i+1]&&(newArr.indexOf(arr[i])==-1) ){
        //如果arr中的数字重复了,且这个数还没被push进newArr数组中就执行
            newArr.push(arr[i]);
            i++;
        }
    }
    console.log(newArr);
}
duplicates([5,5,2,3,1,6,3])

结果为:3,5

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回 -1

LeetCode区域和检索 - 数组不可变

给定一个整数数组 nums,求出数组从索引 i到j (i ≤ j)范围内元素的总和,包含i, j 两点

示例:给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()

sumRange(0, 2) -> 1

sumRange(2, 5) -> -1

sumRange(0, 5) -> -3


var NumArray = function(nums) {
  this.array = [nums[0]];
  for (let i = 1, len = nums.length; i < len; i++) {
    this.array.push(nums[i] + this.array[i-1]);
  }
};
NumArray.prototype.sumRange = function(i, j) {
  return (i === 0) ? this.array[j] : (this.array[j] - this.array[i-1]);
};


求一个字符串的字节长度

假设:一个英文字符占用一个字节,一个中文字符占用两个字节

function GetBytes(str){
  var len = str.length;
  var bytes = len;
  for(var i=0; i<len; i++){
    if (str.charCodeAt(i) > 255) bytes++;
  }
  return bytes;
}
alert(GetBytes("你好,as"));

解析:先让长度直接等于这组字符串的长度,再判断如果是中文的话再加1.

而我一开始的思路是一个个判断,英文加1,中文加2.这样效率低

数组扁平化,将一个多维数组变为一维数组

[1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]

function f(arr) {
        arr1 = arr.toString();//使用join(',')也可以,但是里面得用','隔开
        var arr2 = arr1.split();
        console.log(arr2);
    }
    f( [1, [2, 3, [4, 5]]]);

解析:这个其实非常简单,只要掌握了toString()将数组拆成字符串以及split()将字符串变成数组的用法就可以了

用reduce方法实现map方法和filter方法 头条一面

const numbers = [10, 20, 30, 40];
const go = numbers.reduce((finalList, num) => {
  //实现map方法,映射的作用
    num = num * 2;

    if (num > 50) {
  //实现filter方法过滤
        finalList.push(num);

    }

    return finalList;

}, []);

alert(go); // [60, 80]

剑指offer

1.二维数组的查找

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思路:从最左下角的开始查找

function Find(target, array) {
  // write code here
  const n = array.length,
    m = array[0].length;
  let row = n - 1,
    col = 0;
  if (m === 0 && n === 0) {
    return false;
  }
  while (row >= 0 && col <= m - 1) {
    if (array[row][col] > target) {
      row--;
    } else if (array[row][col] < target) {
      col++;
    } else return true;
  }
  return false;
}

查找字符串出现次数最多的字符

  function transform(str){
        var json = [];
        for(var i=0;i<str.length;i++){
            var char = str.charAt(i);   //分离str成一个个的字符;
           // console.log(char);
            //  设置char为json的key,出现的次数json[char]为value;
            if(json[char]){           //设置json的value
                json[char]++;
            }else{
                json[char] = 1;
            }
        }
        var maxchar = null;   //次数最多的字符
        var max = 0           //次数最多的字符的次数
        //冒泡事件找最大值
        for(var key in json){
          console.log(json[key]);
            if(max < json[key]){
                max = json[key];
                maxchar = key;
            }
        }
      console.log("出现的最多是" + maxchar);
        console.log("总共出现的次数" + max);
    }
    //调用函数
    var str ='abccasss';
    transform(str);

删除重复字符串

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

var s = readline();
var arr = [];
for(var i=0;i<s.length;i++){
    if(arr.indexOf(s[i])==-1){ //值为-1即第一次出现
        arr.push(s[i]);
    }
}
print(arr.join(""));