美文网首页
简单算法

简单算法

作者: fejavu | 来源:发表于2019-09-25 01:14 被阅读0次

面试算法题四部曲:

  1. clarification(询问题目细节,边界条件,可能的极端错误情况)。
  2. Possible Solutions (所有可能的解法都和面试官沟通一遍)
    • Compare time &space Complexity(时间&空间复杂度)
    • Optimal Solution (最优解)
  3. Coding (写代码)
  4. Test Cases (写测试用例)
  • 两数之和
    题述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    var temp = {};
    for(let i =0;i<nums.length;i++) {
        if(temp[nums[i]] >= 0) return [temp[nums[i]], i];
        else temp[target-nums[i]] = i;
    }
};
var intersection = function(nums1, nums2) {
    var set1 = new Set(nums1);
    var set2 = new Set(nums2);
    var res = [];
    
    for(let num of set1.values()){
        if(set2.has(num))
            res.push(num);
    }
    return res;
};

for...of... 循环在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句。

for...in... 循环语句以任意顺序遍历一个对象的除Symbol以外的可枚举属性。

  • 排序链表(148)
    在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
    示例 1:
输入: 4->2->1->3
输出: 1->2->3->4

解题思路常见的归并排序,先将链表四分为二,二分为一(快慢指针),直接二分等方法,排序,然后再将已排序的分段链表合并。

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var sortList = function(head) {
  if(head === null) 
    return head;
  
  var len = 0;
  var p = head;
  while(p) {
    len++;
    p = p.next;
  }
  
  var newHead = sort(len);
  return newHead;
  
  function sort(len) {
    if(len === 1) {
      var temp = head;
      head = head.next;
      temp.next = null;
      return temp;
    }
    
    var leftHead = sort(parseInt(len/2));
    var rightHead = sort(len - parseInt(len/2));
    
    var newHead = merge(leftHead, rightHead);
    
    return newHead;
  }
  
  function merge(leftHead, rightHead) {
    var h = ListNode(-1);
    var cur = h;
    while(leftHead && rightHead) {
      if(leftHead.val <= rightHead.val) {
        cur.next = leftHead;
        leftHead = leftHead.next;
      }else {
        cur.next = rightHead;
        rightHead = rightHead.next;
      }
      
      cur = cur.next;
    }
    
    if(leftHead) {
      cur.next = leftHead;
    }
    if(rightHead) {
      cur.next = rightHead;
    }
    cur = h.next;
    h.next = null;
    return cur;
  }
};
  • 插入排序
    插入排序是遍历数组中的每一个元素,并寻找到前一个比它小的数,并插入该数后面。
function insertSort(arr) {
  for(var a = 1;a<arr.length;a++) {
    let key = arr[a];
    let temp = a-1;

    while(temp>0 && arr[temp]>key) {
      arr[temp+1] = arr[temp];
      temp -=1;
    }
    arr[temp+1] = key;    
  }
  return arr;
}

let demoArr = [1,3,2,4,6,9,5];
console.log(insertSort(demoArr));
// [1, 2, 3, 4, 5, 6, 9]
  • 奖牌排序


    奖牌题目
// 奖牌排序
var result = [];
let countryKeys = [];
let countrys = ['322834China', '123422England', '233302France', '123425Japan', '234300Rusia', '123422Korea'];

countrys = countrys.sort().reverse();

countrys.forEach(item => {
  let key = item.match(/\d+/g);
  countryKeys.push(key+'');
});

countryKeys.forEach(item => {
  let names = medalRepeat(item);
  
  names.forEach(name => {
    if(result.indexOf(name)==-1) {
      result.push(name);
    }
  });
});

console.log(result);

function medalRepeat(medalNumStr) {
  var a = 0;
  var countryArr = [];
  var reg = new RegExp(medalNumStr);
  
  while(a< countrys.length) {
    var temp = reg.test(countrys[a]);
    
    if(temp){
      let countryName = countrys[a].replace(/\d+/g,'');
      countryArr.push(countryName);
    }
    a++;
  }
  
  return countryArr.sort();
}

源码

相关文章

  • 算法与数据结构(二):排序篇-O(n^2)算法:选择 &

    排序基础 O(n^2)的算法虽然简单,但也实用!让我们从最简单的基础排序算法开始,打开我们的算法大门! 排序算法 ...

  • LZW压缩算法

    参考链接:超级简单的数据压缩算法—LZW算法压缩算法——lzw算法实现LZW算法 LZW 压缩算法正确图解

  • 简单算法

    冒泡排序: while 实现的二分查找: 递归实现二分查找:

  • 简单算法

    一、3种简单排序 3种排序方法时间复杂度都是n23种简单排序对 数组排序速度: 插入排序 > 选择排序 > 冒泡法...

  • 【简单算法】

    1.不用中间变量,用两种方法交换A和B的值 2.求最大公约数 3.不用内置函数求一个数的平方根 4.用最有效率的方...

  • 简单算法

    一、回文数说明:类似与"aaabaaa","ababa"等对称字符 二、数组去重说明:[1,2,3,4,5,1,7...

  • 简单算法

    面试算法题四部曲: clarification(询问题目细节,边界条件,可能的极端错误情况)。 Possible ...

  • 简单算法:

    快速排序 快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 ...

  • 简单算法

    实现 trim 斐波那契数列 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1...

  • 《机器学习(周志华)》学习笔记(三)

    Q:机器学习中最简单的学习算法是什么? A:最简单的机器学习算法莫过于线性回归算法了。线性回归算法的基本形式如下:...

网友评论

      本文标题:简单算法

      本文链接:https://www.haomeiwen.com/subject/ioxbectx.html