Z字反转

  1. /**
  2. * @param {string} s
  3. * @param {number} numRows
  4. * @return {string}
  5. */
  6. var convert = function(s, numRows) {
  7. if(numRows===1)return s;
  8. const len=Math.min(s.length,numRows);
  9. var rows = new Array(len).fill('')
  10. var isDown = false;
  11. var nowRow = 0
  12. // for(let item of s){
  13. // rows[nowRow] +=item;
  14. // if(nowRow===0||nowRow===len-1){
  15. // isDown=!isDown;
  16. // }
  17. // nowRow +=isDown?1:-1
  18. // }
  19. rows.forEach.call(s,val=>{
  20. rows[nowRow]+=val
  21. if(nowRow===numRows-1){
  22. isDown = false
  23. } else if(nowRow===0){
  24. isDown = true
  25. }
  26. nowRow+=isDown?1:-1
  27. })
  28. return rows.join('');
  29. };
  1. 1. 编程题:使用正则表达式提取URL中参数
  2. 示例: age name 的值,
  3. URL: https://www.taobao.com?name=xiaoming&age=12#years
  4. 答题格式
  5. var getQuery = function(url, name) {
  6. // return url.replace(new RegExp('some regexp'), '$1')
  7. let reg=new RegExp("(?:^|&|\\?)"+name+"=([^&]*)(?:&|$)","i");
  8. return url.match(reg)?.[1];
  9. };
  10. var getQuery2 = function(url, name) {
  11. //'https://www.taobao.com?name=xiaoming&age=1'
  12. //没有参数的情况下
  13. let reg=new RegExp("\\w*\\:\\/\\/\\w*\\.\\w*\\.\\w*\\?\\S*"+name+"=([^&]*)(?:&[^&]*|$)");
  14. if(!url.match(reg))return '';
  15. return url.replace(reg, '$1')
  16. };
  17. 2. 编程题:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
  18. 示例1:
  19. 输入:”abcabcbb
  20. 输出:3
  21. 解释: 因为无重复字符的最长子串是 abc”,所以其长度为 3
  22. 示例 2:
  23. 输入:”bbbbb
  24. 输出: 1
  25. 解释: 因为无重复字符的最长子串是 b”,所以其长度为 1
  26. 输入: "pwwkew"
  27. 输出: 3
  28. 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3
  29. 答题格式
  30. var lengthOfLongestSubstr = function(s) {
  31. let index=0,maxLength=0;
  32. for(let i=0,j=0;j<s.length;j++){
  33. index=s.substring(i,j).indexOf(s[j]);
  34. if(index!==-1){
  35. i =i+index+1
  36. }
  37. maxLength=Math.max(maxLength,j-i+1);
  38. }
  39. return maxLength;
  40. };
  41. 3. 编程题:
  42. 给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。
  43. 有效字符串需满足:
  44. 左括号必须用相同类型的右括号闭合。
  45. 左括号必须以正确的顺序闭合。
  46. 注意空字符串可被认为是有效字符串。
  47. 示例 1:
  48. 输入: "()"
  49. 输出: true
  50. 示例 2:
  51. 输入: "()[]{}"
  52. 输出: true
  53. 示例 3:
  54. 输入: "(]"
  55. 输出: false
  56. 示例 4:
  57. 输入: "([)]"
  58. 输出: false
  59. 示例 5:
  60. 输入: "{[]}"
  61. 输出: true
  62. 答题格式
  63. var isValid = function(s) {
  64. let map=new Map();
  65. map.set('{','}');
  66. map.set('[',']');
  67. map.set('(',')');
  68. let stack=[];
  69. for(let i=0;i<s.length;i++){
  70. if(map.has(s[i])){
  71. stack.push(map.get(s[i]))
  72. }else{
  73. if(stack.pop()!==s[i]){
  74. return false;
  75. }
  76. }
  77. }
  78. //循环完栈没清空
  79. if(stack.length!==0){
  80. return false;
  81. }
  82. return true;
  83. };
  84. 4. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
  85. 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
  86. 要求时间复杂度为 O(n)
  87. 示例:
  88. 给定 nums = [2, 7, 11, 15], target = 9
  89. 因为 nums[0] + nums[1] = 2 + 7 = 9
  90. 所以返回 [0, 1]
  91. 答题格式
  92. var twoSum = function(nums, target) {
  93. let current=0;
  94. while(current<nums.length){
  95. let poor=target-nums[current];
  96. if(nums.lastIndexOf(poor)>current){
  97. return [current,nums.lastIndexOf(poor)];
  98. }
  99. current++;
  100. }
  101. };
  102. //合并有序数组
  103. function mergeArr(left=[],right=[]){
  104. let result=[];
  105. while(left.length&&right.length){
  106. result.push(left[0]<=right[0]?left.shift():right.shift());
  107. }
  108. return result.concat(left,right);
  109. }
  110. // [2,0,2,1,1,0] 排序成 [0,0,1,1,2,2]
  111. var sortColors = function (nums) {
  112. let left = -1;
  113. let right = nums.length;
  114. let i = 0;
  115. while (i < right) {
  116. if (nums[i] === 0) {
  117. swap(nums, i++, left);
  118. } else if (nums[i] === 1) {
  119. i++;
  120. } else {
  121. swap(nums, i++, --right)
  122. }
  123. }
  124. }
  125. //两数相加
  126. var addTwoNumbers = function(l1, l2) {
  127. let node = new ListNode('head')
  128. let temp = node , sum , n = 0
  129. while( l1 || l2 ){
  130. const n1 = l1 ? l1.val : 0
  131. const n2 = l2 ? l2.val : 0
  132. sum = n1 + n2 + n
  133. temp.next = new ListNode( sum % 10 )
  134. temp = temp.next
  135. n = parseInt( sum / 10 )
  136. if(l1) l1 = l1.next
  137. if(l2) l2 = l2.next
  138. }
  139. if( n > 0 ) temp.next = new ListNode(n)
  140. return node.next
  141. }
  142. //斐波那契数列
  143. function fib(n){
  144. if(n<2&&n>=0)return n;
  145. return fib(n-1)+fib(n-2)
  146. }
  147. function fib2(n){
  148. let array=new Array(n+1).fill(null);
  149. array[0]=0;
  150. array[1]=1;
  151. for(let i=2;i<=n;i++){
  152. array[i]=array[i-1]+array[i-2];
  153. }
  154. return array[n]
  155. }
  156. //两数组交集
  157. function contextArray(...args){
  158. let [min,max]=args[0];
  159. for(let i=0;i<args.length;i++){
  160. let [nextmin,nextmax]=args[i];
  161. min=Math.max(min,nextmin);
  162. max=Math.min(max,nextmax)
  163. }
  164. return [min,max];
  165. }


三数之和

  1. var threeSum = function(nums) {
  2. let ans = [];
  3. const len = nums.length;
  4. if(nums == null || len < 3) return ans;
  5. nums.sort((a, b) => a - b); // 排序
  6. for(let i=0;i<len;i++){
  7. if(nums[i]>0)break;
  8. if(i>0&&nums[i]==nums[i-1])continue;
  9. let L=i+1,R=len-1;
  10. while(L<R){
  11. const sum=nums[i]+nums[L]+nums[R];
  12. if(sum===0){
  13. ans.push([nums[i],nums[L],nums[R]]);
  14. while(nums[L]===nums[L+1])L++;
  15. while(nums[R]===nums[R-1])R--;
  16. L++;
  17. R--;
  18. }
  19. else if(sum>0)R--;
  20. else if(sum<0)L++;
  21. }
  22. }
  23. return ans;
  24. };