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"));