Daily-Interview-Question icon indicating copy to clipboard operation
Daily-Interview-Question copied to clipboard

第 161 题:用最精炼的代码实现数组非零非负最小值index

Open libin1991 opened this issue 3 years ago • 185 comments

例如:[10,21,0,-7,35,7,9,23,18] 输出5, 7最小

function getIndex(arr){
      let index=null;
      ...
      return index;
}

libin1991 avatar Sep 15 '20 13:09 libin1991

/**
 * @description 用最精炼的代码实现数组非零最小值 index
 * @param {array} arr 数组
 * @returns {number} index 索引
 */
function getIndex(arr) {
      let index = -1;
      const minVal = arr.reduce((cur, pre) => {
            return (cur <= 0 || pre <= 0) ? Math.max(cur, pre) : cur > pre ? pre : cur;
      }, -1);
      index = arr.findIndex(item => item == minVal && minVal > 0)
      return index;
}

slogeor avatar Sep 16 '20 02:09 slogeor

@slogeor reduce和reduce一起复杂度是多少? 没有体现最精炼

libin1991 avatar Sep 16 '20 02:09 libin1991

@libin1991 上面的时间复杂度是 O(N^2),

function getIndex(arr) {
      let index = -1;
      arr.reduce((pre, cur, k) => {
            if (cur <= 0 || pre <= 0) {
                  index = cur <= 0 && pre <= 0 ? -1 : cur > pre ? k : index;
            } else {
                  index = cur > pre ? index : k;
            }
            return cur > pre ? pre : cur;
      }, -1);
      return index;
}

时间复杂度是 O(N)

slogeor avatar Sep 16 '20 02:09 slogeor

import postwroker from 'worker-loader!./postworker' 有人知道加!这种引入方法是什么意思吗

tanxin03 avatar Sep 16 '20 06:09 tanxin03

@tanxin520 上下文方便说一下嘛

slogeor avatar Sep 16 '20 09:09 slogeor

https://www.webpackjs.com/loaders/worker-loader/ 您访问下这个地址,这上面有这个demo,但是没讲这个!的意思,我想了解一下,麻烦了 @slogeor

tanxin03 avatar Sep 16 '20 10:09 tanxin03

const arr = [10, 21, 0, -7, 35, 7, 9, 23, 18];

function findMinimumIndex(arr) {
  return arr.findIndex(item => item === arr.filter(item => item > 0).sort((a, b) => a - b)[0])
}
console.log(findMinimumIndex(arr))

这个时间复杂度也不低

slogeor avatar Sep 21 '20 13:09 slogeor

@libin1991 楼主,我是否可以贡献一题,实现 JSON.stringify 方法

slogeor avatar Sep 22 '20 01:09 slogeor

@libin1991 上面的时间复杂度是 O(N^2),

function getIndex(arr) {
      let index = -1;
      arr.reduce((pre, cur, k) => {
            if (cur <= 0 || pre <= 0) {
                  index = cur <= 0 && pre <= 0 ? -1 : cur > pre ? k : index;
            } else {
                  index = cur > pre ? index : k;
            }
            return cur > pre ? pre : cur;
      }, -1);
      return index;
}

时间复杂度是 O(N)

function getIndex(arr) {
      let index = -1;
      arr.reduce((pre, cur, k) => {
            if (cur <= 0 || pre <= 0) {
                  index = cur <= 0 && pre <= 0 ? -1 : cur > pre ? k : index;
            } else {
                  index = cur > pre ? index : k;
            }
            return cur > pre ? pre : cur;
      }, -1);
      return index;
}

输出答案都是错的!

getIndex([10,21,0,-7,35,7,9,23,18])
// 8

libin1991 avatar Sep 22 '20 02:09 libin1991

@libin1991 上面的时间复杂度是 O(N^2),

function getIndex(arr) {
      let index = -1;
      arr.reduce((pre, cur, k) => {
            if (cur <= 0 || pre <= 0) {
                  index = cur <= 0 && pre <= 0 ? -1 : cur > pre ? k : index;
            } else {
                  index = cur > pre ? index : k;
            }
            return cur > pre ? pre : cur;
      }, -1);
      return index;
}

时间复杂度是 O(N)

function getIndex(arr) {
      let index = -1;
      arr.reduce((pre, cur, k) => {
            if (cur <= 0 || pre <= 0) {
                  index = cur <= 0 && pre <= 0 ? -1 : cur > pre ? k : index;
            } else {
                  index = cur > pre ? index : k;
            }
            return cur > pre ? pre : cur;
      }, -1);
      return index;
}

输出答案都是错的!

getIndex([10,21,0,-7,35,7,9,23,18])
// 8

调整了一下

function getIndex(arr) {
    if (!arr.length) return -1;
    let index = -1;
    arr.reduce((pre, next, k) => {
        const min = Math.min(pre, next);
        const max = Math.max(pre, next, 0);
        // 都是正数
        if (pre > 0 && next > 0) {
            index = min === pre ? index : k
            return min;
        }

        index = (max === 0 ||  max === pre) ? index : k;
        return max;
    }, 0)
    return index;
}

slogeor avatar Sep 22 '20 02:09 slogeor

常规写法

function rankVoteMaxIndex(arr) {
            let itemIndex = 0;   // 非0最小index
            let itemRank=0;      // 非0最小值
            let length=arr.length;
            if(!length){
                 return -1;
            }
            for(let i=0;i<length;i++){
                let item=arr[i];
                if(item<0) continue;
                if(!itemRank) {
                    itemIndex = i;
                    itemRank = item;
                }
                if(item < itemRank ){
                    itemIndex = i;
                    itemRank = item;
                }
               
            }
            return itemIndex;
        }

这个答案面试官给了65分(满分100)

rankVoteMaxIndex([-1] // 0 rankVoteMaxIndex([-1, 0, 1] // 0

slogeor avatar Sep 22 '20 02:09 slogeor

image

<script>

    function rankVoteMaxIndex(arr) {
        let itemIndex = -1;   // 非0最小index
        let itemRank = -1;      // 非0最小值
        let length = arr.length;
        if (!length) {
            return itemIndex;
        }
        for (let i = 0; i < length; i++) {
            let item = arr[i];
            if (item > 0) {
                if (itemRank < 0) {
                    itemIndex = i;
                    itemRank = item;
                }
                if (item < itemRank) {
                    itemIndex = i;
                    itemRank = item;
                }
            }

        }
        return itemIndex < 0 ? -1 : itemIndex;
    }

    // rankVoteMaxIndex([-1] // 0
    // rankVoteMaxIndex([-1, 0, 1] // 0

    console.log(rankVoteMaxIndex([-1]));
    console.log(rankVoteMaxIndex([-1, 0, 1]));
    console.log(rankVoteMaxIndex([10, 21, 0, -7, 35, 7, 9, 23, 18]))
    console.log(rankVoteMaxIndex([0, 10, 21, 0, -7, 35, 7, 9, 23, 18]))
</script>

libin1991 avatar Sep 22 '20 03:09 libin1991

会不会B格不够高

const arr = [-10, 0, 10, 21, 0, -7, 35, 7, 9, 23, 18]
let minNum
let minIndex = -1
for (let i = 0, len = arr.length; i < len; i++) {
	if (minNum) {
		if (arr[i] < minNum && arr[i] > 0) {
			minNum = arr[i]
			minIndex = i
		}
	} else {
		if (arr[i] > 0) {
			minNum = arr[i]
			minIndex = i
		}
	}
}

console.log(minIndex, minNum)

XuedaoYuan avatar Sep 24 '20 10:09 XuedaoYuan

const minIndex = (arr) => arr.reduce((num, v, i) => v > 0 && v < arr[num] ? i : num, 0)

HuiGeGeGitHub avatar Sep 25 '20 03:09 HuiGeGeGitHub

先找出大于0的数,然后排序,最小值就是非负非零的最小值,楼上的这个也算一个方法

MissNanLan avatar Oct 12 '20 14:10 MissNanLan

const minIndex = (arr) => arr.reduce((num, v, i) => v > 0 && v < arr[num] ? i : num, -1)

初始值为-1的话是没法找到最小值的,经测试这条式子有点问题,做了一点调整,代码如下

// 先找到第一个非负非零的值的下标
function findInitialValue(arr) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] > 0) return i;
  }
  return -1;
}
const arr = [10, 21, 0, -7, 35, 7, 9, 23, 18];
function minIndex(arr) {
  let first = findInitialValue(arr);
  // 无非负非零的数,直接返回-1
  if (first === -1) return -1;
  return arr.reduce(
    (num, cur, curIndex) => (cur > 0 && cur < arr[num] ? curIndex : num),
    // 关键是reduce的初始值
    first
  );
}
console.log(minIndex(arr)); // 5

reduce用法相关参考链接: https://aotu.io/notes/2016/04/14/js-reduce/index.html

llllllllr avatar Oct 16 '20 03:10 llllllllr

function getIndex(arr) {
	return arr.reduce((idx, cur, k) => idx = cur <= idx[1] && cur > 0 ? [k, cur] : idx, [-1, Number.MAX_SAFE_INTEGER])[0]
}

xueshuai avatar Oct 16 '20 03:10 xueshuai

const minIndex = (arr) => arr.reduce((num, v, i) => v > 0 && v < arr[num] ? i : num, -1)

初始值为-1的话是没法找到最小值的,经测试这条式子有点问题,做了一点调整,代码如下

// 先找到第一个非负非零的值的下标
function findInitialValue(arr) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] > 0) return i;
  }
  return -1;
}
const arr = [10, 21, 0, -7, 35, 7, 9, 23, 18];
function minIndex(arr) {
  let first = findInitialValue(arr);
  // 无非负非零的数,直接返回-1
  if (first === -1) return -1;
  return arr.reduce(
    (num, cur, curIndex) => (cur > 0 && cur < arr[num] ? curIndex : num),
    // 关键是reduce的初始值
    first
  );
}
console.log(minIndex(arr)); // 5

reduce用法相关参考链接: https://aotu.io/notes/2016/04/14/js-reduce/index.html

code:

arr.reduce((res, value, index) => value > 0 && (res === -1 || arr[index] < arr[res]) ? index : res, -1)

zhanhongtao avatar Oct 18 '20 01:10 zhanhongtao

实现的比较low,用for对比实现的:

(() => {
    function getIndex(arr) {
        let index;
        let n = Infinity;
        for (let i = 0; i < arr.length; i++) {
            const item = arr[i];
            if (item > 0 && item<n) {
                n = item;
                index = i;
            }
        }

        return index;
    }

    let arr = [10, 21, 0, -7, 35, 7, 9, 23, 18]

    console.log(getIndex(arr));
})();

Mrcxt avatar Oct 27 '20 12:10 Mrcxt

function getIndex(arr){
  let index = null
  index = arr.reduce((temp, v, i, arr)=>{
    if(v > 0 && v < arr[temp]){
      return i
    }else{
      return temp
    }
  }, 0)
  return index
}

littleebirds avatar Nov 09 '20 06:11 littleebirds

// 不知道有没有重复的元素, 那就直接取了最前出现的, 时间复杂度O(n), 空间复杂度O(1)
function getIndex(arr){
  let index = -1;
  let min = Infinity
  for(let i = 0; i < arr.length; i++){
    if(arr[i] > 0 && arr[i] < min) {
      min = arr[i]
      index = i
    }
  }
  return index;
}

let test = [
  [[10,21,0,-7,35,7,9,23,18], 5],
  [[10,21,0,-7,35,7,9,23,1], 8],
  [[1,21,0,-7,35,7,9,23,1], 0],
  [[], -1]
]
for(let i = 0; i < test.length; i++){
  let [arr, n] = test[i]
  console.log(getIndex(arr) === n)
}

其实就看怎么理解最精简, 我认为是时间空间复杂度小的, 如果说从代码行数来讲, 并没有什么意义, 都可以压缩成一行代码, 还有就是有可读性

shetia avatar Nov 09 '20 09:11 shetia

function getIndex(arr){
  const indexMap = arr.reduce((map,item,index) => { map[item] = index ; return map;}, {});
  return indexMap[arr.filter(i => i>0).sort(a, b => a - b)[0]] || -1;
}

DarthVaderrr avatar Nov 12 '20 02:11 DarthVaderrr

function getIndex(arr) {
  const min = Math.min(...(arr.filter(i => i > 0)));
  const index = arr.indexOf(min);
  return index + ',' + min;
}

const arr = [10,21,0,-7,35,7,9,23,18];
console.log(getIndex(arr));

hcc0007 avatar Nov 12 '20 15:11 hcc0007

最精炼的代码,没说是最小的复杂度啊

function getIndex(arr) {
        let min=Math.min(...arr.filter(i=>i>0));
        let index=arr.indexOf(min);
        return [index, min].join(', ');
}

asiyk-ava avatar Nov 13 '20 15:11 asiyk-ava

最精炼的代码,没说是最小的复杂度啊

function getIndex(arr) {
        let min=Math.min(...arr.filter(i=>i>0));
        let index=arr.indexOf(min);
        return [index, min].join(', ');
}

赞同👍

brushbird avatar Nov 15 '20 10:11 brushbird

const minIndex = (arr) => arr.reduce((num, v, i) => v > 0 && v < arr[num] ? i : num,0)

JiangMengLei avatar Nov 16 '20 10:11 JiangMengLei

// 方法一
function getIndex(arr){
    let index = null;
    let min;
    for(let i = 0, l = arr.length; i < l; i++) {
        if(arr[i] < min && arr[i] > 0 || !min && arr[i] > 0) {
            min = arr[i];
            index = i;
        }
    }
    return index;
}

//方法二
function getIndex(arr){
    return arr.indexOf(Math.min(...arr.filter(v => v > 0)));
}

zhouhan1033 avatar Nov 18 '20 02:11 zhouhan1033

function getIndex(arr) {
    return arr.reduce((v, x, i, ori) => x > 0 ? (x < ori[(v === -1 ? 0 : v)] ? i : v) : v, -1);
}

ReAlign avatar Nov 18 '20 06:11 ReAlign

function getIndex(arr){
  let index=null;
  let min = arr[0];
  let len = arr.length;

  for(let i = 0; i < len;i++){
    if(arr[i] > 0){
      if(min > arr[i]){
        index = i;
        min = arr[i];
      }
    }
  }
  return index;
}

逐个对比每次记录最小值以及下标

ptylll avatar Nov 18 '20 07:11 ptylll

const minIndex = arr => 
  arr.indexOf(Math.min(...arr.filter(val => val > 0)));

sailor95 avatar Nov 19 '20 05:11 sailor95

function getIndex(arr) {
    return arr.reduce((pre, next, k) => {
        if (next <=0) return -1
        if (pre === -1) return k
        return Math.min(arr[pre], next) === next ? k : pre
    }, -1)
}
getIndex([10,21,0,-7,35,7,9,23,18])  // 5

zengpeng123 avatar Nov 19 '20 07:11 zengpeng123

const minIndex = (arr)=>{ let arr1= arr.filter(item=>item>0) retutn arr1.length > 0 ? arr.findIndex(Math.min(...arr1)) : -1 } minIndex([-1,0,0,0])

qianshuideyu avatar Nov 23 '20 07:11 qianshuideyu

function getMin(arr) {
  let min = 0;
  let result = 0;
  arr.forEach((item, index) => {
    if (item > 0 && (!min || item < min)) {
      min = item;
      result = index;
    }
  });
  return result;
}

garrettzxd avatar Nov 24 '20 02:11 garrettzxd

一个for循环解决 // 方法一 this.minVal = this.arr[0]; this.result = 0; for (let i = 0; i < this.arr.length; i++) { let curVal = this.arr[i]; if (curVal > 0 && curVal < this.minVal) { this.minVal = curVal; this.result = i; } } console.log(this.minVal,this.result, "val") }`

zxx1992 avatar Nov 24 '20 02:11 zxx1992

function getIndex(arr) {
  let index = null
  index = arr.reduce(function (minI, item, i) {
    return item > 0 && (item < arr[minI] || minI === null) ? i : minI
  }, null)
  return index
}

auyo18 avatar Nov 27 '20 08:11 auyo18

function getIndex(arr){
  let i = 0;
  let index;
  let min;
  while (i < arr.length) {
    if (!min && arr[i] > 0) {
      index = i;
    }
    if (min && arr[i] > 0 &&  arr[i] < min) {
      index = i;
    }
    i++;
  }
  return index;
}

hhhpw avatar Dec 01 '20 02:12 hhhpw

const minIndex = (arr) => arr.reduce((num, v, i) => v > 0 && v < arr[num] ? i : num, 0)

使用reduce可选参数要从0开始,-1的话会输出-1

Jade-Zeng avatar Dec 04 '20 08:12 Jade-Zeng

    const array = [0,-10,-5,1,9,5,1,4,7,10];
    function getIndex(arr){
        let minValue = arr.filter(item => item > 0).sort((a,b) => a -b)[0]
        return arr.indexOf(minValue)
    }
    console.log(getIndex(array));
    function getIndex1(arr){
        return arr.findIndex(item => item === arr.filter(item => item > 0).sort((a,b) => a -b)[0]);
    }
    console.log(getIndex1(array));

yukiyukixing avatar Dec 06 '20 07:12 yukiyukixing

function getIndex(arr){
    let index=null;
    let minNum = Math.min(...arr.filter(item => item > 0));
    index = arr.findIndex(item => item === minNum);
    return index;
}

Brother-Yang avatar Dec 07 '20 06:12 Brother-Yang

function getIndex(arr) {
  let min = undefined;
  let index = -1;
  arr.forEach((item, i) => {
    if (item > 0 && ((min && item < min) || !min)) {
      min = item;
      index = i;
    } 
  })
  return index;
}

undo03 avatar Dec 18 '20 02:12 undo03

function getIndex(arr) {
  let index = -1;
  let min = Number.MAX_SAFE_INTEGER;
  for (const i in arr) {
    if (arr[i] < min && arr[i] > 0) {
      min = arr[i];
      index = i;
    }
  }
  return index;
}

mesterLi avatar Dec 21 '20 12:12 mesterLi

function getIndex(arr){
            let minIndex = -1;
            let min = Number.MAX_SAFE_INTEGER;
            arr.forEach( (item, index) => {
                if( item > 0 &&  item < min){
                    min = item;
                    minIndex = index;
                }
            })
            return minIndex;
        }

Facefall avatar Dec 27 '20 07:12 Facefall

function getIndex(arr) { let min = Math.min(...arr.filter(item => item > 0)) let index = arr.indexOf(min) return ${index} ${min} }

golden0425 avatar Dec 30 '20 16:12 golden0425

function getIndex(arr){ let res = Array.from(arr) return res.indexOf(arr.filter((v, i) => v > 0).sort((a,b) => Number(a) - Number(b))[0]); }

Craaaaazy77 avatar Jan 02 '21 16:01 Craaaaazy77

function getIndex(arr) {
    let index = 0, mixEle = arr[0]
    arr.forEach((ele, i) => {
        if (ele > 0 && mixEle > ele) {
            index = i
            mixEle = ele
        }
    });
    return index
}

这个只要遍历一遍就好了吧?

xun19 avatar Jan 06 '21 02:01 xun19

// 时间复杂度O(N) function getIndex(arr) { let index = -1; arr.reduce((prev, cur, i) => { if (cur > 0) { const min = Math.min(prev, cur); if (cur === min) { index = i; prev = cur; } } return prev; }, Infinity); return index; } const res = getIndex([10, 21, 0, -7, 35, 7, 9, 23, 18]); console.log(res); //5

Simplyme0823 avatar Jan 07 '21 10:01 Simplyme0823

题目有点不清楚,我理解的是,如果一个数组中全部都是<= 0的数,那返回-1,而且用reduce看起来很酷,但性能真的没有for循环好呀,是我对这个题目没有理解清楚吗?大家都用reduce做

function getIndex(arr){
    if(arr.length <= 0) return -1
    let index = -1;
    for(let i = 0; i < arr.length; i++) {
        if(index < 0) {
            index = arr[i] > 0 ? i : index
            continue;
        }
        if(arr[i] < arr[index] && arr[i] > 0) {
            index = i
        }
    }
    return index;
}

dengshasha avatar Jan 12 '21 07:01 dengshasha

function getIndex(arr) { return arr.indexOf(Math.min.apply(null, arr.filter(item => item > 0))) }

guoxiangdejian avatar Jan 21 '21 09:01 guoxiangdejian

let arr = [10, 21, 0, -7, 35, 7, 9, 23, 18]
let min = -1
let minItem = arr[0]
let len = arr.length
for (let i = 0; i < len; i++) {
    if (arr[i] > 0 && arr[i] < minItem) {
        min = i
        minItem = arr[i]
    }
}
console.log(min, minItem)

shufei021 avatar Jan 24 '21 04:01 shufei021

for循环的

function getIndex (arr) {
  let index = -1
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] > 0 && (index < 0 || arr[i] < arr[index])) {
      index = i
    }
  }
  return index
}

优雅的

function getIndex (arr) {
  const _arr = arr.filter(val => val > 0)
  const min = Math.min(..._arr)
  const index = arr.indexOf(min)
  return index
}

精(zhuang)简(bi)的

function getIndex (arr) {
  return arr.reduce((index, val, i) => val <= 0 ? index : ((index < 0 || arr[i] < arr[index]) ? i : index), -1)
}

zfowed avatar Jan 25 '21 07:01 zfowed

let obj = [10, 21, 0, -7, 35, 7, 9, 23, 18].reduce((result, item, index) => { if (!result[item] && item > 0) { result[item] = index; } return result }, {}) let res = Object.keys(obj)[0] console.info(res, obj[res])

zjkblade avatar Jan 28 '21 02:01 zjkblade

function getIndex(arr) { let index = null; index = arr.findIndex(item => item === Math.min(...arr.filter(item => item > 0))) return index; }

lujiayu666666 avatar Feb 23 '21 06:02 lujiayu666666

一次遍历就行了,循环找到符合条件的替换下标返回,不符合还返回原本下标 function getIndex(arr){ return arr.reduce((acc, cur, idx)=> cur > 0 && cur < arr[acc] ? idx : acc, -1) }

ct-0902 avatar Feb 23 '21 09:02 ct-0902

function getIndex(arr){
    // 先找到第一个非符的数及其下标
    let index = 0;
    while(arr[index] <=0 && index < arr.length){
        index++;
    }
    if(index >= arr.length){
        return -1;
    }
    // 从第一个非负的数字开始遍历
    let min = arr[index];
    for(let i = index+1;i < arr.length;i++){
        if(arr[i] > 0 && arr[i] <min){
            min = arr[i];
            index = i;
        }
    }
    return index;
}

yinhaiying avatar Feb 25 '21 03:02 yinhaiying

function getIndex(arr){
    return arr.indexOf(Math.min.apply(null,[].concat(arr).filter(item=>item>0)))
}

aafnnp avatar Mar 02 '21 06:03 aafnnp

function getMinIndex(arr) {
    let min = Infinity
    let minIndex
    arr.forEach((v, i) => {
        if (typeof v === 'number' && v > 0) {
            if (v < min) {
                min = v
                minIndex = i
            }
        }
    })
    return minIndex
}

zhangfangbiao avatar Mar 02 '21 07:03 zhangfangbiao

easy

function getIndex(arr){
    let index=null;
    let index_0 = arr[0]  // 假设符合预期的值为第一个
    for(let i = 0; i < arr.length; i++) {
        if(arr[i] <= index_0 && arr[i] > 0) {
             index_0 = arr[i] 
             index = i 
        }
    }
    return index;
}

Houngtze avatar Mar 02 '21 08:03 Houngtze

题目考的是应该条件判断的使用: 如何用最精炼的条件判断来描述题目给出的逻辑 使用reduce 如果只要求找非0非负最小值 条件判断next < 0 || (prev > 0 && perv < next) ? prev : next

  • 如果next < 0 则直接返回prev
  • 如果next > 0, 继续判断prev; 如果prev < 0 直接返回next
  • 如果上面两条都不满足 证明next和prev都大于0,最后再比较prev和next的大小

如果只找到满足条件的值,这么写即可; 如果数组内的值都是小于等于0的值,会默认返回第一个值(可以根据具体情景做调整)

function getIndex(arr) {
  return arr.reduce((prev, next) => (next < 0 || (prev > 0 && prev < next) ? prev : next))
}

题目不光要求找到值,还要求找到下角标,用变量存一下下角标就行了

function getIndex(arr) {
  let minIdx = -1;
  let min = arr.reduce((prev, next, currIdx) => {
    if (next < 0 || (prev > 0 && prev < next)) {
	    return prev;
    } else {
	    minIdx = currIdx;
	    return next;
    }
});
return minIdx > -1 ? [minIdx, min].join(",") : -1;
}

Luz-Liu avatar Mar 04 '21 11:03 Luz-Liu

function getIndex(arr) { let index = arr.filter(i=>i>0).sort((a,b)=>a-b)[0]; let value=arr.findIndex(i=> i ==value ) return [value, index ].join(",") }

chenzhaohua11 avatar Mar 05 '21 00:03 chenzhaohua11

// 最小正数
function minRPlus(arr) {
  const l = arr?.length;
  let i = 0,
    minIdx;

  // 先找到最小非零、非负数
  for (; i < l; i++) {
    if (arr[i] > 0) {
      minIdx = i;
      break;
    }
  }

  // 再找到最小数
  for (; i < l; i++) {
    if (arr[i] > 0 && arr[i] < arr[minIdx]) {
      minIdx = i;
    }
  }
  return minIdx;
}

NgeKaworu avatar Mar 05 '21 03:03 NgeKaworu

function getIndex(arr) {
    let index = null;
    for (let i = 0; i < arr.length; i++) {
        if(arr[i] > 0) {
            if(arr[index] > arr[i] || !index) {
                index = i
            }
        }
    }
    return index;
}

类似选择排序,只是不需要排序,而是在第一层遍历时增加逻辑判断。

hk4114 avatar Mar 13 '21 10:03 hk4114

function getIndex(arr){
  let index=null;
  index = arr.findIndex(item => item === Math.min.apply(null, arr.filter(item => item > 0)))
  return index;
}

zh-lc avatar Mar 16 '21 01:03 zh-lc

虽然代码有点多,但时间复杂度应该是最低的吧?

function getIndex(arr){
    let index = -1;
    if(!Array.isArray(arr) || arr.length==0) return index;
    let target;
    for(let i=0,len=arr.length; i<len; i++){
        const value = arr[i];
        if(typeof target==="undefined"){
            target = value;
            if(target>0){
                index = i;
            }
        }else{
            if(target>value && value>0){
                target = value;
                index = i;
            }
        }
    }
    return index;
}


const a = [10,21,0,-7,35,7,9,23,18];
console.log(getIndex(a))

huangzhiyang166 avatar Mar 19 '21 08:03 huangzhiyang166

const find05 = (arr) => { let index = null, minval = arr[0]; for (let i = 0; i < arr.length; i++) { let val = arr[i]; if (val < minval && val > 0) { minval = val index = i } } return index }

XW666 avatar Mar 29 '21 08:03 XW666

const arr = [10, 21, 0, -7, 35, 7, 9, 23, 18]

function getIndex(arr) { let index = -1 arr.forEach((item, i) => { if(item <= 0) { index ++ }else if(item < arr[index]) { index = i } }) return index }

const index = getIndex(arr) console.log(index, arr[index])

isMyShell avatar Apr 01 '21 07:04 isMyShell

function getIndex(arr){ return arr.indexOf(Math.min(...arr.filter(item=>item>0))) }

89757zxb avatar Apr 02 '21 02:04 89757zxb

function getIndex(arr){ let index=null; index = arr.indexOf( arr.filter(a => a > 0).sort((a, b ) => { return a - b })[0]) return index; }

Gansto avatar Apr 07 '21 06:04 Gansto

` function getMin(arr,min = 0) {

for (let i=0; i<arr.length; i++) {
  if (arr[i]>0 && min==0) min = i;
  min = arr[i]>0 && arr[i]< arr[min] ? i : min
}
return min

} `

xxq520 avatar Apr 08 '21 14:04 xxq520

var list = [10,21,0,-7,35,7,9,23,18];
function getIndex(arr) {
    let index = null
    let num = arr[0]
    arr.forEach((item, index2) => {
        if (num > 0 && arr[index2 + 1] > 0 && num > arr[index2 + 1]) {
            num = arr[index2 + 1]
            index = index2 + 1
        }
    })
    return index
}
console.log('getIndex', getIndex(list))

manggo-dilivery avatar Apr 09 '21 08:04 manggo-dilivery

function getMinIndex(list){
            const result = [Infinity, -1];
            for(let i = 0 , len = list.length ; i < len ; i++){
                const temp = list[i]
                if(temp > 0 && temp < result[0]){
                    result[0] = temp
                    result[1] = i
                }
            }
            if(result[1] > -1){
                return result[1];
            }else {
                return undefined;
            }
        }

时间复杂度 O(n)

jdkwky avatar Apr 12 '21 09:04 jdkwky

function findNumIndex(arr) {
      let result = [-1, Infinity];
      arr.forEach(function (obj, index) {
          if (obj > 0 && obj < result[1]) {
              result = [index, obj];
          }
      });
      return result;
  }

这个最简练确实每个人理解都有不同

sjhleo avatar Apr 13 '21 01:04 sjhleo

const min = arr.filter(v => v > 0).sort((a, b) => a - b)[0]

const index = arr.findIndex(v => v === min);

poppydani avatar Apr 19 '21 02:04 poppydani

function findMinNumIndex(arr) {
  if (!arr || !(arr || []).length) return -1
  let min = { index: -1, data: Infinity }
  arr.forEach((ele, idx) => {
    if (ele > 0 && ele < min.data) {
      min.data = ele
      min.index = idx
    }
  })
  return min.index
}

jackchenl avatar Apr 19 '21 06:04 jackchenl

function getIndex(arr){ let indexs = arr.filter((item)=>item !== 0 && Math.sign(item) !== -1); let a0 = indexs.sort((a,b)=> a-b)[0]; return arr.indexOf(a0); }

TechnicalGod avatar Apr 20 '21 03:04 TechnicalGod

function findMinNumIndex(arr){
    let min = Number.MAX_SAFE_INTEGER, ind = -1;
    arr.forEach((item,index) => {
        if(typeof item === 'number' && item > 0 && item < min){
            min = item;
            ind = index;
        }
    });
    return ind;
}

zhhuan avatar Apr 22 '21 15:04 zhhuan

function getIndex(arr) { const [, minIndex] = arr.reduce( ([min, minIndex], el, index) => { if (el > 0 && (minIndex === -1 || min > el)) { return [el, index]; } return [min, minIndex]; }, [null, -1], ); return minIndex; }

haipingzi avatar Apr 24 '21 06:04 haipingzi

function getIndex(arr) {
     const [, minIndex] = arr.reduce(
       ([min, minIndex], el, index) => {
         if (el > 0 && (minIndex === -1 || min > el)) {
           return [el, index];
         }
         return [min, minIndex];
       },
       [null, -1],
     );
     return minIndex;
   }

haipingzi avatar Apr 24 '21 06:04 haipingzi

function getIndex(arr) {
    let index = null;
    arr.reduce((min, cur, internalIndex) => {
        if (cur <= 0) return min;
        if (cur < min) {
            index = internalIndex;
            return cur;
        }
        return min;
    }, Infinity)
    return index;
}

fuweihang avatar Apr 27 '21 11:04 fuweihang

function getIndex(arr) {
        let index = null
        const obj = {}
        arr.forEach((num, i) => {
            if (num > 0) {
                obj[num] = i
            }
        })
        index = Object.values(obj)[0]
        return index
    }

ruanlinxin avatar May 02 '21 02:05 ruanlinxin

//  尝试使用补码
function getIndex(arr){
    return arr.reduce(
        (prevIndex,curVal,curIndex) =>
            ~curVal < -1  
            && 
            (!~prevIndex || arr[prevIndex] >= curVal)  
                ? 
                curIndex 
                : 
                prevIndex,
        -1)
}

ydl2018 avatar May 07 '21 09:05 ydl2018

function getIndex(arr) {
  return arr.reduce((minIndex, value, index) => {
    if (value > 0) {
      if (minIndex === -1) {
        minIndex = index;
      } else if (value < arr[minIndex]) {
        minIndex = index;
      }
    }
    return minIndex;
  }, -1);
}

nomyfan avatar May 08 '21 16:05 nomyfan

按我自己理解方式试了一把,又是留下了没有技术的泪水一天 ` // 找出最小值 [10,21,0,-7,35,7,9,23,18] const temp = [10, 21, 0, -7, 35, 7, 9, 23, 18];

function findMin(value) {
    if (value.length === 0) return [-1, -1];
    return value.reduce((cur, item, index) => {
        console.log("item", item, cur);
        if (index === 0) cur = [index, item];
        if (item > 0 && item < cur[1]) {
            cur[0] = index;
            cur[1] = item;
        }
        return cur;
    }, []);
}

findMin(temp);

`

chenxihub avatar May 10 '21 08:05 chenxihub

按我自己理解方式试了一把,又是留下了没有技术的泪水一天 // 找出最小值 [10,21,0,-7,35,7,9,23,18] const temp = [10, 21, 0, -7, 35, 7, 9, 23, 18];

function findMin(value) {
    if (value.length === 0) return [-1, -1];
    return value.reduce((cur, item, index) => {
        console.log("item", item, cur);
        if (index === 0) cur = [index, item];
        if (item > 0 && item < cur[1]) {
            cur[0] = index;
            cur[1] = item;
        }
        return cur;
    }, []);
}

findMin(temp);

这样好像也行

function findMin2(value) {
        if (value.length === 0) return false;
        return value.reduce((cur, item, index) => item > 0 && item < value[cur] ? index : cur, value.length - 1);
    }

chenxihub avatar May 10 '21 08:05 chenxihub

例如:[10,21,0,-7,35,7,9,23,18] 输出5, 7最小

function getIndex(arr){
      let index=null;
      arr.reduce((acc, cur, i) => {
        if (acc > cur && cur > 0) {
          index = i
          return cur
        } else {
          return acc
        }
      })
      return index;
}
function getIndex(arr){
      return arr.indexOf(arr.reduce((acc, cur, index) => acc > cur && cur > 0 ? cur : acc))
}

JoyZ-nineteen avatar May 12 '21 09:05 JoyZ-nineteen

// 例如:[10,21,0,-7,35,7,9,23,18] 输出 5, 7 最小
function getIndex(arr) {
  let index = null
  let prev = null
  arr.forEach((item, currentIndex) => {
    if (item > 0 && (!prev || item < prev)) {
      prev = item
      index = currentIndex
    }
  })
  return index
}
const index = getIndex([10,21,0,-7,35,7,9,6,23,18])
console.log(index)

z1948296027 avatar May 14 '21 06:05 z1948296027

function demo(arr) { let index = 0; let min = arr[0]; for (let i = 1; i < arr.length - 1; i++) { if (arr[i] > 0 && arr[i] < min) { index = i; min = arr[i]; } } return [index, min] }

bc-baicha avatar May 14 '21 08:05 bc-baicha

const arr = [10,21,0,-7,35,7,9,23,18]; function getIndex(arr){ return arr.reduce((prev, next, index) => (next>0 && next < prev[0]) ? [next, index] : prev ,[Infinity, -1]);
} getIndex(arr) 这应该挺简洁的

FE-ng avatar May 17 '21 03:05 FE-ng

先找出大于0的数,然后排序,最小值就是非负非零的最小值,楼上的这个也算一个方法

准确来说,第二把冒泡拿到最小的就行,不需要完整的排序,复杂度两者还是有点差距的。

alanhe421 avatar May 19 '21 09:05 alanhe421

function getIndex(arr) {
    let min = -1;
    return arr.reduce((res, item, idx) => {
        if (item > 0 && (idx === 0 || item < min)) {
            min = item;
            return idx;
        }
        return res;
    }, -1);
}

alanhe421 avatar May 19 '21 10:05 alanhe421

function getIndex(arr) {
    let index = null;
    const res = arr.reduce((obj, item, index) => {
        if (obj.value) {
            if (item > 0 && item < obj.value) {
                return {value: item, index}
            }
            return obj;
        } else {
            if (item > 0) {
                return {value: item, index}
            }
            return obj;
        }
    }, {})
    index = res.index;
    return index;
}

hackshen avatar May 20 '21 07:05 hackshen

function getIndex(arr){ if(!arr || arr.length ===0) {return null} let index=null; arr.forEach((item,theIndex) =>{if((index === null || item < arr[index]) && item > 0) index = theIndex} ) return index; }

时间复杂度N,空间复杂度1

eason-shsf avatar May 20 '21 09:05 eason-shsf

function g(a) {
  return a.findIndex(i => i === a.filter(i => i > 0).sort((a, b) => a - b)[0])
}

g([10, 21, 0, -7, 35, 7, 9, 23, 18])

function g(a) { return a.findIndex(i => i === a.filter(i => i > 0).sort((a, b) => a - b)[0]) } g([10, 21, 0, -7, 35, 7, 9, 23, 18]).length

133个字符~~

dengshenkk avatar Jun 04 '21 07:06 dengshenkk

function getIndex(arr) {
  const newArr = [...arr].sort((a, b) => a - b).filter(x => x > 0)
  return newArr.length ? arr.indexOf(newArr[0]) : null;
}

mu-yu avatar Jun 04 '21 09:06 mu-yu

function getIndex(arr){ return arr.reduce((pre,cur,index,array)=>{ if(cur>0){ return cur>array[pre]? pre:index; } return pre; },null) }

Josh119891 avatar Jun 06 '21 06:06 Josh119891

function getIndex(arr){
     let index=null;
     for(let i = 0;i<arr.length;i++){
            if(arr[i]>0 && (index === null||arr[i]<arr[index])){
                index = i
            }
        }
      return index;
}

tedpan avatar Jun 08 '21 14:06 tedpan

很简单的题怎么被你们整的那么复杂 function getIndex(arr){ let maxValue = Infinity; let index=null; arr.forEach((element, ind) => { if (element > 0 && element < maxValue) { maxValue = element; index = ind; } }); return index; } 这样不就行了嘛

PossibleMaybe avatar Jun 17 '21 02:06 PossibleMaybe

// 实现数组非零非负最小值index
const minIndex = arr.reduce((pre, cur, i) => cur > 0 ? (cur > arr[pre] ? pre : i) : pre);

fuller-xu avatar Jun 25 '21 16:06 fuller-xu

Without reduce

function getIndex(arr) {
    let index = null;
    let m = Number.POSITIVE_INFINITY;
    for(let i=0; i<arr.length; i++){
        if (arr[i] < m && arr[i] > 0) {
            index = i;
            m = arr[i];
        } 
    }
    return index;
}

ryadav96 avatar Jun 26 '21 11:06 ryadav96

function posMin(arr) { let arr2 = arr.map(i => i + Math.abs(i)); let min = 0; return arr2.reduce((acc, cur, idx) => { return !cur ? acc : !min || cur < min ? (min = cur, idx) : acc; }, -1) }

没跑几个用例,写了图一乐

Yupotian-Simon avatar Jun 30 '21 02:06 Yupotian-Simon

function getIndex(arr) {
  let index = -1;
  let prev = Infinity;
  arr.forEach((item, idx) => {
    if (item > 0 && item < prev) {
      prev = item;
      index = idx;
    }
  });
  return index;
}

jafshare avatar Jul 06 '21 02:07 jafshare