前言
这周加班有点狠,早上10点半到公司晚上回到家11点精力几乎奔溃,刷完一题算法,在洗漱一下已经1点左右。自己的进度还是比较慢的,各方都在争夺自己的利益,产品为了产品更好,持续改动小需求, 后端人员为了自己能快速完成任务,数据几乎很少处理,接口的什么规范没有落地就是鬼扯,一会给我说get put post delete, 一会又给我搞个formdata 不经想到之前一家创业型公司技术团队一共7个人给我说我们要测试驱动开发玩的tdd开发模式,我看看了代码,这种代码和我在百度上复制的有啥区别,问我为啥出bug 我哪里知道,代码都是百度上复制的。今年是第四个年头眼看还有一个月就进入第五个年头,却还在这种团队呆着,着实感觉自己有些差劲。一边说这高大上的理念,一边又不实实在在的践行落地,这种画饼的伎俩真是low。在一些先进的东西面前我觉得还是要去适应的,vscode 之前 我们习惯于sublime,webstrom, vscode 出来之后呢大多数人开始习惯使用vscode,听说最近idea 的Fleet未来也要出生。希望自己能很好的适应新出现的规则和变化。昨天加班回来后倒头就睡,今天快一点爬起来洗漱完,推开窗发现楼下的这个颜色挺好看。
二分查找返回目标元素下标
描述: 给定一个数组,输入一个目标数,返回这个数的下标没有找到这个目标值返回-1;
解题思路:
-
- 将数组对半分开 获取中间分界点
-
- 用目标值比对中间分界点
-
- 如果相等返回分界点的下标值。如果发现分界点小于目标值,那么说明目标值很可能在大于分界点的那部分值中,如果发现分办点小于目标值,那么说明目标值很可能在小于分界点的那部分。
-
- 如果出现不相等的情况,进下步动态缩小查找范围。
-
- 重复1-4步。
解:
findTarget(arr, target) {
let min = 0;
let max = arr.length - 1;
while(min <= max) {
// 动态获取分界点
let mind = (Math.floor((max - min) / 2)) + min;
if (arr[mind] == target) {
return mind;
}
if (arr[mind] < target) {
min = mind + 1;
}
if (arr[mind] > target) {
max = mind - 1;
}
}
return -1;
}
复制代码
二路归并排序
描述: 数据排序已经很长常见了,给定一个乱序的数组,返回从小到到的排序后返回
解题思路:
-
- 把这一堆数据按组划分 分到最小一个组块为一个单元停上划分
-
- 所有数据划分完成停止划分
-
- 划分到最小单元后 开始两两有序的开始合并
解:
halfSort(arr) {
// 最小单元了开始返回
if (arr.length <2) {
return
}
let mind = Math.floor(arr.length / 2);
let left = arr.slice(0, mind);
let right = arr.slice(mind, arr.length);
// 左右合并
return merge(halfSort(left), halfSort(right));
}
merge(left, right) {
let arr = [];
while(left.length && right.length) {
// 比较划分后每个块的第一个元素
if (left[0] < right[0]) {
arr.push(left.shift());
} else {
arr.push(right.shift());
}
}
//left和right长度不一样时,直接连接剩下的长的部分(上次比划后的有序数据)
return arr.concat(left, right);
}
复制代码
两数之和
描述: 给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
解题思路:
-
- 先为当前的数据建立一个
索引
和值
的map 对象
- 先为当前的数据建立一个
-
- 然后遍历目标元素在生成的map对象中查找,如果生成map对象中找到了当前值返回当前的map对象值的索引。
解:
twoSun(nums, target) {
let map = new Map();
// 根据当前数组建立map索引
for (let i = 0; i < nums.length; i++) {
map.set(nums[i], i);
}
for (let j = 0; j < nums.length; j++) {
let tmp = target - nums[j];
if(map.has(tmp) && map.get(tmp) != j){
return [j, map.get(tmp)]
}
}
}
复制代码
两数平方和
描述: 给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a2 + b2 = c
。
解题思路
- 得到平方根确定为最大值,在设置一个最小值。
- 根据平方根根公式计算出当前范围内的两个数的值 开始循环,如果计算出的值和这个数相等返回 true 如果小于这个数,动态调整两个变量的大小
解:
sqanSun(number) {
let min = 0 ;
// 得到平方根
let max = parseInt(Math.sqrt(number));
while(min <= max) {
//平方公式
let current = min * min + max * max ;
if(current == number) {
return true
}
if(current < number) {
min++;
}
if(current > number) {
max--;
}
}
return false;
}
复制代码