一. 数
1. 不借助临时变量交换两个数?
实现交换仍然需要临时变量,这个临时变量只能有 a b 承担,且 要不是 “和” 要不是 “差”,这种不变的东西。
// 如:let a = 2;let b = 4;// 方法1:a = a + b; // a 被看做临时变量,存两者之和b = a - b;a = a - b;// 方法2:a = a - b; // a 被看做临时变量,存两者之差b = b + a;a = b - a;
当时,自己一口气就写出来了,还是挺给人自信的。
今天再看犀牛书的时候,还看到一种更狠的:
let a = 2;let b = 4;[a, b] = [b, a];
2. 一个数组中的最大最小数之差
寻找一个数组中的最大值,基本语言能力。
function getDiff(list) {let min = list[0];let max = list[0];for (let i = 0; i < list.length; i ++) {let item = list[i];if (min > item) {min = item;} else if (max <= item) {max = item;}}return max - min;}let list = [4, 5, 8, 3, 9];console.log('最大差为:', getDiff(list));
再给一个简单的版本:
let max = tt[0], min = tt[0];for (let v of tt) {if (v > max) {max = v;}if (v < min) {min = v;}}
3. 大数相加
(钉钉的笔试题)
function add(x, y) {if (!(/^\d*$/.test(x) && /^\d*$/.test(y))) {return;}const x_arr = x.split('');const y_arr = y.split('');// 补齐位数if (x_arr.length > y_arr.length) {let more = x_arr.length - y_arr.length;for (let i = 0; i < more; i++) {y_arr.unshift(0);}}if (x_arr.length < y_arr.length) {let more = y_arr.length - x_arr.length;for (let i = 0; i < more; i++) {x_arr.unshift(0);}}let needAdd = 0;let resultArr = [];for (let i = x_arr.length - 1; i >= 0; i--) {let p = parseInt(x_arr[i]);let q = parseInt(y_arr[i]);let sum = p + q + parseInt(needAdd) + ''; // 数字转字符串sum = sum.split('');resultArr.unshift(sum.pop());needAdd = sum.pop() || 0; // 没有进位,默认为0}if (parseInt(needAdd) === 1) {resultArr.unshift(1);}return resultArr.join('');}console.log(add('1', '2'));console.log(add('9', '2'));console.log(add('10', '11'));console.log(add('10', '999'));console.log(add('1', '999'));console.log(add("11111111111111111111", "22222222222222222222"));
写的是什么玩意,这么复杂,
function add(x, y) {let naughtyBoy = 0;let add1 = x.split('').reverse();let add2 = y.split('').reverse();let sum = [];// 假设 add1 比较长for (let i = 0; i < add1.length; i++) {let _sum = Number(add1[i]) + Number(add2[i]) + naughtyBoy;if (_sum < 10) {sum[i] = _sum;naughtyBoy = 0;} else {sum[i] = _sum - 10; // 取个位naughtyBoy = 1;}}return sum.reverse().join('');}
4.版本号对比
(钉钉的笔试题)
function compareVersion(v1, v2) {if ((typeof v1 !== 'string') || (typeof v2 !== 'string')) {return;}let version1_arr = v1.trim().split('.');let version2_arr = v2.trim().split('.');// 补齐位数if (version1_arr.length > version2_arr.length) {const more = version1_arr.length - version2_arr.length;for (let i = 0; i < more; i++) {version2_arr.push(0);}}if (version1_arr.length < version2_arr.length) {const more = version2_arr.length - version1_arr.length;for (let i = 0; i < more; i++) {version1_arr.push(0);}}for (let i = 0; i < version1_arr.length; i++) {let _v1 = parseInt(version1_arr[i]);let _v2 = parseInt(version2_arr[i]);if (_v1 > _v2) {return 1;} else if (_v1 < _v2) {return -1;} else {continue;}}return 0;}console.log(compareVersion('1.2', '1.2.0'))console.log(compareVersion('13.37', '1.2 '));console.log(compareVersion('0.1', '1.1.1'));
5. 数组去重,以及统计一组数中重复数量最多的字符。
6. 二分查找有序数组(数组顺序从小到大)
let pos = 0;function binarySearch(target, arr) { // 我们平时不会用这个方法,但是这个思想应该知道let midPos = arr.length >>> 1;let mid = arr[midPos];if (target === mid) {return pos + midPos;} else if (target > mid) {pos = pos + midPos;return binarySearch(target, arr.slice(midPos));} else {return binarySearch(target, arr.slice(0, midPos));}}let arr = [1,2,4,6,8,9,11,34,67];let target = 11;console.log(`数组${JSON.stringify(arr)}中${target}的位置:`, binarySearch(target, arr));
算法更高级些:
function find(arr, target, initalIndex) {const midIndex = Math.floor(arr.length / 2);const midValue = arr[midIndex];if (target === midValue) {return midIndex + initalIndex;} else if (target < midValue) {return find(arr.slice(0, midIndex), target, 0);} else {return find(arr.slice(midIndex), target, midIndex);}}
二. 字符操作
1. 生成指定长度的随机字符串
: 属于 对 math api 的熟悉,本身算法的感觉不强
function randomString(length, chars) {var result = '';for (var i = length; i > 0; --i) {result += chars[Math.floor(Math.random() * chars.length)]};return result;}var rString = randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
2. 字符串查找
:请使用最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中,并返回第一次出现的位置
function includes(source, target) { // source 是否包含 target 字符串// 'dog' 包含于 'mydogismine'for (let i = 0; i < source.length; i++) {let _source = source.slice(i);if (_isSameString(_source, target)) {return true;}}}function _isSameString(source, target) {let clipedSouce = source.slice(0, target.length); // 截取相同长度进行对比return clipedSouce === target;}console.log('mydogismine 包含 dog 吗?', includes('mydogismine', 'dog'));console.log('mydogismine 包含 dog 吗?', includes('mydogismine', 'dogs'));
简单点:
var x = 'abc';var y = 'sdfsfdfsabcdsfsdfabc';function find(target, source) {const targetLength = target.length;for (let i = 0; i < source.length; i++) {if (target === source.slice(i, i + targetLength)) {return i;}}}find(x, y);
3. 判断一个单词是否有回文
考点:去复习下 数组 的常见 api,如 reverse reduce 等等,另外由此扩展 其他 js api 的使用。
4. 字符串中出现的不重复的最长长度
我写的第一版 是根据调试写出来的,所以在思路上并成熟,它不是先由好的思路发展而来:
// 字符串出现的不重复最长长度function getLength(str) {let resultMap = [];let stack = [];let i = 0;let pre;while(i <= str.length) {if (str[i] !== pre) {if (i === str.length) {resultMap.push(stack.join(''));stack = [];} else {stack.push(str[i]);}} else {if (stack.length > 0) {resultMap.push(stack.join(''));stack = [];}}pre = str[i];i++;}return resultMap;}console.log(getLength('abcckkldk'));
