// 这题一看就是 计数问题,题目中如果存在一值在数组中出现至少两次,
// 句话就告诉我们记录每一个数字出现的次数就能解决问题了。
// const containDuplicate = function(nums) {
// let map = new Map();
// for(let i of nums) {
// if(map.has(i)) {
// return true;
// }
// else {
// map.set(i, 1);
// }
// }
// return false;
// }
// 字符串中的第一个唯一字符
// const fristUniqChar = function(str) {
// let mapObj = {};
// for(let i of str) {
// console.log(i);
// mapObj[i] = (mapObj[i] || 0) + 1;
// console.log('---', mapObj[i]);
// }
// console.log('---', mapObj);
// for(let j = 0; j < str.length; j++) {
// if(mapObj[str[j]] === 1) {
// return j;
// }
// }
// return -1;
// }
// const s = "loveleetcode";
// const result = fristUniqChar(s);
// console.log('结果', result);
// 有效的字母异位词
// 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
// 输入: s = "anagram", t = "nagaram"
// 输出: true
// const isAngram = function(s, t) {
// const sLen = s.length;
// const tLen = t.length;
// if(sLen !== tLen) {
// return false;
// }
// const obj = {};
// for(let i = 0; i < sLen; i++) {
// const curS = s[i];
// const curT = t[i];
// obj[curS] ? obj[curS]++ : obj[curS] = 1;
// console.log('----', obj);
// obj[curT] ? obj[curT]-- : obj[curT] = -1;
// console.log('++++++', obj);
// }
// return Object.values(obj).every(v => v === 0);
// }
// const s = "anagram";
// const t = "nagaram";
// const res = isAngram(s, t);
// console.log(res);
// 输入:nums = [2,7,11,15], target = 9
// 输出:[0,1]
// 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
// 用 hashMap 存储遍历过的元素和对应的索引。 每遍历一个元素,看看 hashMap
// 中是否存在满足要求的目标数字。 所有事情在一次遍历中完成(用了空间换取时间)
// const findTarget = function(nums, target) {
// // 构建哈希表 存储方式 {need, index}
// // 1. 构造哈希表
// const map = new Map(); // 存储方式 {need, index}
// // 2. 遍历数组
// for (let i = 0; i < nums.length; i++) {
// // 2.1 如果找到 target - nums[i] 的值
// if (map.has(nums[i])) {
// return [map.get(nums[i]), i];
// } else {
// // 2.2 如果没找到则进行设置
// map.set(target - nums[i], i);//把i需要的那个数的hash表的位置填上i =>对应上面get(nums[i])
// }
// }
// // let mapNums = {};
// // for(let i = 0; i < nums.length; i++) {
// // const curItem = nums[i];
// // const targetNum = target - curItem;
// // const targetNumIdx = mapNums[targetNum];
// // if(targetNumIdx !== undefined) {
// // return [targetNumIdx, i];
// // }
// // else {
// // mapNums[curItem] = i;
// // }
// // }
// }
// const nums = [2,7,11,15];
// const target = 9;
// const res = findTarget(nums, target);
// console.log(res);
// 找规律题
// 最长公共前缀
// let longestCommonPrefix = function(strs) {
// if(strs.length === 0) {
// return '';
// }
// if(strs.length === 1) {
// return strs[0]
// }
// return strs.reduce(getSameStr, strs[0]);
// }
// function getSameStr(a, b) {
// let res = '';
// for(let j = 0; j < a.length; j++) {
// if(a[j] === b[j]) {
// res += a[j];
// }
// else {
// return res;
// }
// }
// return res;
// }
// const strs = ["dog","racecar","car"]
// const res = longestCommonPrefix(strs);
// console.log(res);
// 合并两个有序链表,变为升序链表
// function ListNode(val, next) {
// this.val = (val===undefined ? 0 : val)
// this.next = (next===undefined ? null : next)
// }
// var mergeTwoLists = function(l1, l2) {
// if ( l1 == null) return l2;
// if ( l2 == null) return l1;
// if( l1.val < l2.val){
// l1.next = mergeTwoLists(l1.next,l2);
// return l1
// }else {
// l2.next = mergeTwoLists(l1,l2.next);
// return l2
// }
// };
// const l1 = '1->2->4';
// const l2 = '1->3->4';
// const res = mergeTwoLists(l1, l2);
// console.log(res);
// let strStr = function(haystack, needle) {
// if(needle === '') {
// return 0;
// }
// for(let i = 0; i < haystack.length; i++) {
// if(haystack[i] === needle[0]) {
// if(haystack.substring(i, i + needle.length) === needle) {
// return i;
// }
// }
// }
// return -1;
// }
// const haystack = "hello", needle = "ll"
// const res = strStr(haystack, needle);
// console.log(res);
// 杨辉三角
// let generate = function(numRows) {
// if(numRows == 0) {
// return [];
// }
// const result = Array.from(new Array(numRows), () => []);
// for(let i = 0; i < numRows; i++) {
// result[i][0] = 1;
// result[i][i] = 1;
// for(let j = 1; j < i; j++) {
// result[i][j] = result[i-1][j-1] + result[i-1][j];
// }
// }
// return result;
// }
// const rows = 5;
// const res = generate(rows);
// console.log(res);
// 买卖股票的最佳价格
// const maxProfix = function(prices) {
// let res = 0;
// let min = prices[0];
// for(let i = 1; i < prices.length; i++) {
// if(prices[i] < min) {
// min = prices[i];
// }
// else {
// res = Math.max(res, prices[i] - min);
// }
// }
// return res;
// }
// 买卖股票的最佳时机2
// const maxProfix = function(prices) {
// let result = 0;
// for(let i = 1; i < prices.length; i++) {
// if(prices[i] > prices[i-1]) {
// result += prices[i] - prices[i-1];
// }
// }
// return result;
// }
// 反转链表
// const reverseList = function(head) {
// let [pre, node] = [null, head];
// while(node) {
// const temp = node.next;
// node.next = pre;
// pre = node;
// node = temp;
// }
// return pre;
// }
// const head = [1,2,3,4,5]
// const res = reverseList(head);
// console.log(res);
//
// const merge = function(nums1, m, nums2, n) {
// let len = m + n -1;
// m--;
// n--;
// while(m >= 0 && n >= 0) {
// if(nums1[m] > nums2[n]) {
// nums1[len] = nums1[m--];
// }
// else {
// nums1[len] = nums2[n--];
// }
// len--;
// }
// if(m === -1) {
// return nums1.splice(0, len+1, ...nums2.slice(0, n + 1));
// }
// if(n === -1) {
// return nums1;
// }
// }
// 验证回文串
// const isPalindrome = function(s) {
// s = s.replace(/[^\w]/g, '').toLowerCase();
// let leftPointer = 0;
// let rightPointer = s.length - 1;
// while(rightPointer > leftPointer) {
// if(s[leftPointer++] === s[rightPointer--]) {
// continue;
// }
// else {
// return false;
// }
// }
// return true;
// }
// 移动零
// const moveZeroes = function(nums) {
// let i = j = 0;
// while(i < nums.length) {
// console.log('-----', nums[i]);
// if(nums[i] !== 0) {
// console.log('-----', nums[i], '++++', nums[j]);
// [nums[i], nums[j]] = [nums[j], nums[i]];
// j++;
// }
// console.log('++++', nums[i]);
// i++;
// }
// return nums;
// }
// 反串字符串
// const reverseStr = function(s) {
// let l = 0;
// let r = s.length - 1;
// while(l < r) {
// [s[l], s[r]] = [s[r], s[l]];
// l++;
// r--;
// }
// return s;
// }
// 两个数组的交集
// const intersect = function(nums1, nums2) {
// nums1.sort((a, b) => a - b);
// nums2.sort((a, b) => a - b);
// let l1 = 0;
// let l2 = 0;
// const nums1Len = nums1.length;
// const nums2Len = nums2.length;
// const resArr = [];
// while(l1 < nums1Len && l2 < nums2Len) {
// if(nums1[l1] === nums2[l2]) {
// resArr.push(nums1[l1]);
// l1++;
// l2++;
// }
// if(nums1[l1] > nums2[l2]) {
// l2++;
// }
// if(nums1[l1] < nums2[l2]) {
// l1++;
// }
// }
// return resArr;
// }
// const nums1 = [1,2,2,1], nums2 = [2,2];
// const res = intersect(nums1, nums2);
// console.log(res);
console