two sum

一、
执行用时:124 ms, 在所有 JavaScript 提交中击败了47.42%的用户
内存消耗:43.6 MB, 在所有 JavaScript 提交中击败了15.89%的用户

  1. var twoSum = function(nums, target) {
  2. const result = [];
  3. nums.forEach( (x1,y1) =>{
  4. nums.slice(y1+1).forEach( (x2,y2) => {
  5. if( x1 + x2 === target ){
  6. result.push(y1,y1+y2+1)
  7. }
  8. } )
  9. } )
  10. return result
  11. };

二、
执行用时:76 ms, 在所有 JavaScript 提交中击败了96.52%的用户
内存消耗:38.1 MB, 在所有 JavaScript 提交中击败了74.35%的用户

  1. var twoSum = function (nums, target) {
  2. for(let a = 0;a<nums.length;a++){
  3. for(let b = a+1;b<nums.length;b++ ){
  4. if( nums[a] + nums[b] === target){
  5. return [a,b]
  6. }
  7. }
  8. }
  9. };

三、*
执行用时:64 ms, 在所有 JavaScript 提交中击败了99.96%的用户
内存消耗:38.2 MB, 在所有 JavaScript 提交中击败了72.54%的用户

  1. var twoSum = function(nums, target){
  2. const map = new Map();
  3. for(let i=0; i<nums.length; i++){
  4. if (map.has(nums[i])){
  5. return [map.get(nums[i]),i];
  6. }else{
  7. map.set(target-nums[i],i);
  8. }
  9. }
  10. }

总结:

for、forEach、map区别;

  • for循环和forEach区别
    • for 可以使用break;跳出循环,优化性能;forEach报错;
    • for 函数内的for可以使用return;forEach无效;
    • for循环过程中支持修改索引(修改 i),但forEach做不到(底层控制index自增,我们无法左右它)


  • forEach 参数 arr.forEach(function(self,index,arr){ //this 执行obj },obj)

  • map

    • arr.map( function(val,key,arr){},this )
    • 循环内部有能力改变原数组
    • map和forEach处理数组元素的范围是在callback第一次调用就已经确认了;
      • 比如数组的长度—数组新增加的数据是不会被遍历访问;
      • 但是map遍历数组的元素,是在map调用后,访问元素前才生效;如果在此期间删除元素,访问不到
  1. var arr = [{name:1},{name:2}]
  2. var bee=arr.map( item=>{
  3. arr.splice(0,arr.length);
  4. return item
  5. } )
  6. // index=1的元素访问不到了;
  7. bee [{…}, empty]
  8. //但是扩展运算符可以解决这个问题
  9. var arr = [{name:1},{name:2}]
  10. // [...arr]生成一个新的数组;
  11. var bee=[...arr].map( item=>{
  12. arr.splice(0,arr.length);
  13. return item
  14. } )

其他:

如何做导航页:
svg、pop、z-index