SOURCE

/**
 * 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 
 * 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
 * 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
 * 你可以按任意顺序返回答案。
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/two-sum
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */

/**
 * 利用两层循环 外层控制相减得到的值
 * 内层 以i+1 起始位置进行对比 发现相等即返回
 */
// const twoSum = function (nums, target) {
//     const len = nums.length;
//     const result = [];

//     for (let i = 0; i < len; i++) {
//         let other = target - nums[i];
//         for (let j = i + 1; j < len; j++) {
//             if (nums[j] === other) {
//                 result.push(i, j);
//                 return result;
//             }
//         }
//     }

//     return result;
// };

/**
 * 利用map存储值 
 * 如果发现相减之后存在于map结构中那么就返回序列号i以及map的key
 * 注意要先进行判断 后存储 因为会出现 [3,3] 6这种情况
 */
// const twoSum = (nums, target) => {
//     const len = nums.length;
//     const map = new Map();

//     for (let i = 0; i < len; i++) {
//         if (map.has(target - nums[i])) {
//             return [i, map.get(target - nums[i])];
//         }
//         map.set(nums[i], i);
//     }

//     return [];
// };


/**
 * 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,
 * 并且每个节点只能存储 一位 数字。
 * 请你将两个数相加,并以相同形式返回一个表示和的链表。
 * 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/add-two-numbers
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
function ListNode(val, next) {
    this.val = (val === undefined ? 0 : val)
    this.next = (next === undefined ? null : next)
}
/**
 * 其实就是利用两个指针 一个指针指向返回新链表的头部(head)
 * 另一个指针移动将链表串接起来
 * sum = num1 + num2 + carry
 * carry = sum / 10 | 0 
 */
// const addTwoNumbers = function (l1, l2) {
//     let head = null;
//     let tail = null;
//     let carry = 0;

//     while (l1 || l2) {
//         const node1 = l1 ? l1.val : 0;
//         const node2 = l2 ? l2.val : 0;

//         const sum = node1 + node2 + carry;
//         carry = sum / 10 | 0;

//         if (!head) {
//             head = tail = new ListNode(sum % 10);
//         } else {
//             tail.next = new ListNode(sum % 10);
//             tail = tail.next;
//         }
//         if (l1) {
//             l1 = l1.next;
//         }
//         if (l2) {
//             l2 = l2.next;
//         }
//     }
//     if (carry) {
//         tail.next = new ListNode(carry);
//     }

//     return head;
// };

/**
 * https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
 * 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
 * 输入: s = "abcabcbb"
 * 输出: 3 
 * 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
 * @param {string} s
 * @return {number}
 * fn:lengthOfLongestSubstring(s) => number
 */

/**
 * 从左往右数 有重复就更新缓存数组 并进行比较
 * 更新max 并清空缓存
 * 概述:从左到右 缓存统计 是否有重复项 O(n^2)
 */
// const lengthOfLongestSubstring = (s) => {
//     const len = s.length;
//     let tempObj = {};
//     let count = 0;
//     let max = 0;

//     if (len <= 1) {
//         return len;
//     }

//     for (let i = 0; i < len; i++) {
//         for (let j = i; j < len; j++) {
//             if (tempObj[s[j]]) {
//                 if (count > max) {
//                     max = count;
//                 }
//                 count = 0;
//                 tempObj = {};
//                 break;
//             } else {
//                 tempObj[s[j]] = s[j];
//                 count += 1;

//             }
//         }
//     }

//     return max;
// };


/**
 * 思路:因为要获取无重复的字符串所以利用Map结构判定是否重复,
 * 以及利用i指针更新重复的最高索引
 * 概括:Map去重 i更新重复的最大索引 O(n)
 */
// const lengthOfLongestSubstring = (s) => {
//     const len = s.length;
//     const map = new Map();
//     let i = 0;//重复的索引位置
//     let max = 0;

//     for (let j = 0; j < len; j++) {
//         if (map.has(s[j])) {
//             i = Math.max(map.get(s[j]) + 1, i);
//         }
//         map.set(s[j], j);
//         max = Math.max(max, j - i + 1);
//     }

//     return max;
// };
console 命令行工具 X clear

                    
>
console