编程训练(一)

156 阅读4分钟

1.找出第二个的数为x的位置

// 找出第二个的数为x的位置
var arr=[1,2,4,5,2,1,0,1,5]
function find(arr,target){
  var count=0;
  for(var [key,value] of arr.entries()){
    if (value == target) {
      ++count;
      if(count==2){
        return key;
      }
    }
  }
  return -1;
};
console.log(find(arr, 1));//5

2.找出数组中和为sum的两个数

// 找出数组中和为sum的两个数
function findItem(arr,sum){
  arr.sort((a,b)=>a-b);
  var left=0;
  var right=arr.length-1;
  var res=[];
  while(left < right){
    if(arr[left] + arr[right] < sum){
      left++;
    } else if (arr[left] + arr[right] > sum) {
      right--;
    } else if (arr[left] + arr[right] == sum){
      res.push([arr[left], arr[right]]);
      left++;
      right--;
    }
  }
  return res;
};
var arr=[1,4,6,7,2,3,8],sum=9;
console.log(findItem(arr, sum)); //[ [ 1, 8 ], [ 2, 7 ], [ 3, 6 ] ]

3.Array.from()

var arr = [1, 2, 3, 4]
var res = Array.from(arr);
console.log(res); //[ 1, 2, 3, 4 ]
console.log(res===arr);//false

4.用二分法、递归找出数组中数为target的值

// 输出19在数组中的位置 [11,13,15,17,19,21] 输出:4,没有找到就输出-1
function findIndex(arr,target) {
  return binarySearch(arr,target,0,arr.length-1)
}
function binarySearch(arr, target, start, end) {
  var middle = Math.floor((start + end) / 2);
  while (start < end) {
    if (arr[middle] == target) {
      return middle
    }
    if (arr[middle] < target) {
      return binarySearch(arr, target, middle + 1, end)
    }
    if (arr[middle] > target) {
      return binarySearch(arr, target, start, middle - 1)
    }

  }
  return -1;
}
var arr=[1,3,5,7,9,10],target=5;
console.log(findIndex(arr, target));//2

5.找出数组中出现次数大于 arr.length/2的数

var majorityElement = function (nums) {
  var middle = nums.length / 2;
  nums.sort((a, b) => a - b);
  var str = nums.join(''); //11222333
  var num = 0,char = '';
  str.replace(/(\w)\1*/g, ($0, $1) => {
    if (num < $0.length) {
      num = $0.length;
      char = $1;
    }
  });
  if (num > middle) {
    return char
  }
};
console.log(majorityElement([2, 2, 1, 1, 1, 2, 2])); //2

6. 实现快排

function quickSort(arr){
  const pivot=arr[0];
  const left=[];
  const right=[];
  if(arr.length<1){
    return arr
  };
  for(var i=1;i<arr.length;i++){
    if(arr[i]<=pivot){
      left.push(arr[i]);
    };
    if(arr[i]>pivot){
      right.push(arr[i]);
    };
  }
  return quickSort(left).concat(pivot, quickSort(right));
};
var arr=[1,1,4,3,2,32,33,22,2,33]
console.log(quickSort(arr)); //[ 1, 1, 2, 2, 3, 4, 22, 32, 33, 33 ]

7.字符串中的第一个唯一字符

var firstUniqChar = function (s) {
  let result = s.length ? [...s].filter((item, index, arr) => {
    return arr.indexOf(item) === arr.lastIndexOf(item);
  }) : [];
  return result.length ? s.indexOf(result[0]) : -1
};

8.扁平化数组以及按深度扁平化

var NestedIterator = function (nestedList,n) {
  while (n&&nestedList.some((item) => Array.isArray(item))) {
    nestedList = [].concat(...nestedList);
    n--;
  }
  return nestedList
};
var NestedIterator = function (nestedList) {
  return nestedList.reduce((prev,cur)=>{
   var temp= Array.isArray(cur) ? NestedIterator(cur) : [cur];
  //  return prev.concat([...temp])
   return [...prev, ...temp]
  },[])
};
var arr = [[1,1],2,[1,1],[1,[2,1]]];
console.log(NestedIterator(arr));

9. 找出两个数组中不一样的值

法一:
var findTheDifference = function (s, t) {
  var obj = {};
  var arr = t.split('');
  for (let i = 0; i < arr.length; i++) {
    obj[arr[i]] = obj[arr[i]] + 1 || 1;
  };
  console.log(obj);
  
  var m=s.split('').map(ch => obj[ch]--);
  console.log(m,obj);
  
  return Object.keys(obj).find(ch => obj[ch] > 0)
}
console.log(findTheDifference("abcd", "abcde"));//e

法二:reduce

var findTheDifference = function (s, t) {
  const dict = t.split('').reduce((acc, cur) => {
    acc[cur] ? acc[cur]++ : acc[cur] = 1
    return acc
  }, {});

  s.split('').forEach(ch => {
    dict[ch]--
  })
 
  return Object.keys(dict).find(ch => dict[ch] > 0)
}
console.log(findTheDifference("abcd", "abcde"));//e

10. 统计一个字符串中的每一个字母出现的次数,以及出现最多次数的字母

// 统计一个字符串中的每一个字母出现的次数,以及出现最多次数的字母 
法一:
function func(str){
  var str=[...str].sort().join('');
  var res=str.match(/(\w)\1*/g);
  var countArr=res.map((item)=>item.length);
  const maxLen = Math.max(...countArr);//找到出现次数最多的次数
  return res.reduce((pre,cur)=>{
    if(cur.length==maxLen){
      pre[cur[0]]=maxLen;
    };
    return pre;
  },{});
  // console.log(res);
}
var str='astcdefst'
console.log(func(str)); //{ s: 2, t: 2 }
法二:
var str='astcdefst' ;
 function find(str){
   var arr=str.split('');
   var obj= arr.reduce((pre,cur)=>{
      pre[cur] ? pre[cur]++ : pre[cur]=1;
      return pre
   },{});
   //obj: { a: 1, s: 2, t: 2, c: 1, d: 1, e: 1, f: 1 }
   const maxLen = Math.max(...Object.values(obj));
   var obj1={};//用来接收结果;
   for(var [k,v] of Object.entries(obj)){
     if(v==maxLen){
       obj1[k]=v;
     }
   };
   return obj1
 }
console.log(find(str)); //{ s: 2, t: 2 }
法三:
 function find(str){
   var arr=str.split('');
   var obj={};
   for (let i = 0; i < arr.length; i++) {
     obj[arr[i]]=obj[arr[i]]+1 || 1;
   }
   //obj: { a: 1, s: 2, t: 2, c: 1, d: 1, e: 1, f: 1 }
   const maxLen = Math.max(...Object.values(obj));
   var obj1={};//用来接收结果;
   for(var [k,v] of Object.entries(obj)){
     if(v==maxLen){
       obj1[k]=v;
     }
   };
   return obj1
 }
 var str = 'astcdefst';
 find(str)
console.log(find(str)); //{ s: 2, t: 2 }

11.找出两个字符串中的差异

var findTheDifference = function (s, t) {
  const dict = t.split('').reduce((acc, cur) => {
    acc[cur] ? acc[cur]++ : acc[cur] = 1
    return acc
  }, {});

  s.split('').forEach(ch => {
    dict[ch]--
  })
 
  return Object.keys(dict).find(ch => dict[ch] > 0)
}

console.log(findTheDifference("abcd", "abcde"));//e

12.输出字符串的最大回文子字符串

var str = 'ddabbade';
function longstStr(str){
  var result='';
  for (var i = 0; i < str.length; i++){
    for (var j = i+1; j < str.length; j++){
      var _str=str.slice(i,j);
      var rev_str=_str.split('').reverse().join('');

      if (_str == rev_str){
        result = result.length < _str.length ? _str : result;
      };
    };
  }
  return result;
}
console.log(longstStr(str)); //dabbad

13.输出字符串的最大回文子字符串的长度

var lengthOfLongestSubstring = function (s) {
  var str = ''; //存放当前最大无重复项字符串
  var len = 0; //存放当前当前最大无重复项字符串长度
  for (var i = 0; i < s.length; i++) {
    var index = str.indexOf(s[i]);
    if (index === -1) { //遍历s将元素挨个放入到str中,每放入一次判断str中是否有重复项
      str += s[i];
      len = len < str.length ? str.length : len; //记录最大长度项,每次重新记录str进行判断,是否大于上次一次最大项
    } else {
      str = str.substr(index + 1) + s[i]; //从当前重复项开始重新记录str
    }
  }
  return len;
}
console.log(lengthOfLongestSubstring("abcabcbb"));