二维数组中的查找
/**
* @param {number[][]} array
* @param {number} target
* @return {boolean}
*/
var searchArray = function(array , target) {
//左=>右,上=>下 递增 ==> 可以从右上角开始
if(!array.length) return false;
let n = array.length;
let i = 0, j = array[0].length - 1;
while(i < n && j >= 0){
if(array[i][j] > target) j--;
else if(array[i][j] < target) i ++;
else return true;
}
return false;
};
斐波那契数列
/**
* @param {number} n
* @return {number}
*/
var Fibonacci = function(n)
{
let ans = [];
ans[0] = 0;
ans[1] = 1
for(let i = 2; i <= 39; i ++){
ans[i] = ans[i-1] + ans[i-2];
}
return ans[n];
}
调整数组顺序使奇数位于偶数前面
- 不维持原来的顺序
/**
* @param {number[]} array
* @return {void}
*/
var reOrderArray = function(array) {
let l = 0, r = array.length - 1;
while(l < r){
while(l < r && array[l] % 2 === 1) l ++;
while(l < r && array[r] % 2 === 0) r--;
if(l < r) {
let t = array[l];
array[l] = array[r];
array[r] = t;
}
}
};
- 维持原来的顺序
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
function reOrderArray( array ) {
// write code here
const arr1 = [];
const arr2 = [];
let length = array.length;
for(let i = 0; i < length; i ++) {
if(array[i] % 2 === 1){
arr1.push(array[i]);
}else{
arr2.push(array[i]);
}
}
return arr1.concat(arr2);
}
module.exports = {
reOrderArray : reOrderArray
};
顺时针打印矩阵
function printMatrix(matrix)
{
// write code here
const res = [];
const n = matrix.length;
if(!n) return res;
const m = matrix[0].length;
let dx = [0, 1, 0, -1];
let dy = [1, 0, -1, 0];
const st = new Array(n).fill(0).map(() => new Array(m).fill(false));
let x = 0, y = 0, d = 0;
for(let i = 0; i < m * n ; i ++) {
res.push(matrix[x][y]);
st[x][y] = true;
let a = x + dx[d], b = y + dy[d];
if(a < 0 || a >= n || b < 0 || b >= m || st[a][b]){
d = (d + 1 ) % 4;
a = x + dx[d];
b = y + dy[d];
}
x = a, y = b;
}
return res;
}
数组中出现次数超过一半的数字
很巧妙,计数法
function MoreThanHalfNum_Solution(numbers)
{
// write code here
let count = 1;
let val = numbers[0];
for(let i = 1; i < numbers.length; i ++) {
if(val !== numbers[i]) {
count --;
if(count < 0) {
count = 1;
val = numbers[i];
}
}else{
count ++;
}
}
return val;
}
把数组排成最小的数
/**
* @param {number[]} nums
* @return {string}
*/
var printMinNumber= function(nums) {
if(!nums || nums.length === 0) return "";
else return nums.sort(compare).join("");
};
var compare = function(a,b){
const q = "" + a + b;
const h = "" + b + a;
return q - h;
}
数组中的逆序对
/**
* @param {number[]} nums
* @return {number}
*/
var inversePairs= function(nums) {
let res = 0;
mergeSort(nums, 0, nums.length - 1);
return res;
function mergeSort(nums, l, r){
if(l >= r) return ;
let mid = l + r >> 1;
mergeSort(nums, l, mid);
mergeSort(nums, mid+1, r);
let k = 0;
let i = l, j = mid + 1;
let tmp = [];
while(i <= mid && j <= r){
if(nums[i] <= nums[j]){
tmp.push(nums[i++]);
}else{
res += mid - i + 1;
tmp.push(nums[j++]);
}
}
while(i <= mid) tmp.push(nums[i++]);
while(j <= r) tmp.push(nums[j++])
for(i = l,j = 0; i <= r; i ++, j ++){
nums[i] = tmp[j];
}
}
};
数字在升序数组中出现的次数
function GetNumberOfK(data, k)
{
// write code here
if(data.indexOf(k) < 0) return 0;
let l = data.indexOf(k);
let r = data.lastIndexOf(k);
return r - l + 1;
}
和为S的两个数字
function FindNumbersWithSum(array, sum)
{
// write code here
if(!array) return []
let l = 0, r = array.length - 1;
while(l < r) {
if(array[l] + array[r] === sum ) return [array[l], array[r]];
else if(array[l] + array[r] > sum) r --;
else l ++;
}
return [];
}
数组中重复的数字
/**
* @param {number[]} nums
* @return {number}
*/
var findRepeatNumber = function(nums) {
let map = new Map();
for(let i = 0; i < nums.length; i ++){
if(map.has(nums[i])) return nums[i];
else map.set(nums[i],1);
}
return null;
};
构建乘积数组
function multiply(a)
{
// write code here
const res = [];
let left = [];
let right = [];
left[0] = right[a.length - 1] = 1;
for(let i = 1; i < a.length; i ++) {
left[i] = left[i -1] * a[i - 1];
}
for(let j = a.length-2; j>=0 ; j--){
right[j] = a[j+1] * right[j+1];
}
for(let k=0;k<a.length;k++){
res[k] = left[k] * right[k];
}
return res;
}