JS 는 어떻게 배열 중심 색인 과정 을 찾 습 니까?
우 리 는 이렇게 배열 중심 색인 을 정의 합 니 다.배열 중심 색인 의 왼쪽 모든 요소 에 추 가 된 것 과 오른쪽 모든 요소 에 추 가 된 것 과 같 습 니 다.
만약 배열 에 중심 색인 이 존재 하지 않 는 다 면,우 리 는-1 로 돌아 가 야 합 니 다.만약 배열 에 여러 개의 중심 색인 이 있다 면,우 리 는 가장 왼쪽 에 있 는 것 으로 돌아 가 야 한다.
예시 1:
입력:
nums = [1, 7, 3, 6, 5, 6]
출력:3
설명:
색인 3(nums[3]=6)의 왼쪽 수의 합(1+7+3=11)은 오른쪽 수의 합(5+6=11)과 같다.
또한 3 도 요구 에 부합 되 는 첫 번 째 중심 색인 이다.
예시 2:
입력:
nums = [1, 2, 3]
출력:-1
설명:
배열 에는 이 조건 을 만족 시 키 는 중심 색인 이 존재 하지 않 습 니 다.
설명:nums 의 길이 범 위 는[0,10000]입 니 다.모든 nums[i]는[-1000,1000]의 정수 가 될 것 입 니 다.
우 리 는 먼저 분석 하고 나의 실현 방향 을 말 한 다음 에 다른 사용자 들 의 양질 의 해답 을 공유 합 니 다.
제목 이 전달 하고 자 하 는 의 미 는 사실 명확 하 다.i 에 옮 겨 다 닐 때 i 왼쪽 의 모든 요소(i 포함 되 지 않 음)와 i 오른쪽 에 있 는 모든 요소(i 포함 되 지 않 음)와 같다.옮 겨 다 니 는 과정 에서 만족 하면 i 로 돌아 가 고 만족 하지 않 으 면-1 로 돌아간다.
내 가 제일 먼저 생각 한 것 은 매번 i 를 옮 겨 다 니 며 배열 의 좌 우 를 각각 두 개의 배열 로 나 누 어 비교 하고 만족 하면 i 로 돌아 가 는 것 이다.만약 에 되 돌아 가 는 것 을 찾 지 못 하면-1.
이 문제 의 구 덩이 를 미리 알려 주 고 나의 이해 에 따 르 면 예 를 들 어 하나의 배열[1,-1,1]은 사실 i 가 1 인 상황 만 비교 할 수 있다.
i 가 0 일 때 왼쪽 에 요소 가 존재 하지 않 고 비교 할 필요 가 없 기 때문에 i 가 2 일 때 오른쪽 에 요소 가 없고 비교 할 필요 가 없 기 때문에 제 가 처음에 순환 하 는 조건 은:
for (var i = 1; i < nums.length - 1; i++) {}
그리고 제출 하면 끊 어 집 니 다.힌트 는 0 으로 돌아 가 야 합 니 다.-1 이 아니 라 공식 적 인 이해 에 따 르 면 i 가 0 일 때 왼쪽 에 요소 가 없 지만 0(저 는 복 용 했 습 니 다.)입 니 다.수정 을 통 해 이곳 에서 나의 실현 을 제공 하 는 것 은 비교적 거칠다.
/**
* @param {number[]} nums
* @return {number}
*/
var pivotIndex = function(nums) {
var i = 0,
//
sum_l = 0,
//
sum_r = 0,
len = nums.length;
for (; i < len; i++) {
// i 0 ,nums[0 - 1] undefined, NaN
if(nums[i - 1]){
sum_l += nums[i - 1];
};
// i
nums.slice(i + 1).map(item => {
sum_r += item;
});
// , i
if (sum_l == sum_r) {
return i;
} else {
// ,
sum_r = 0;
};
};
return -1;
};
제출 해 보 니 시간 이 없어 서....................................................정말 목숨 을 앗 아 간 알고리즘 을 2S 로...
사실 제목 에 따라 우 리 는 배열 의 모든 요소 의 총 화 는 i+i 왼쪽 과+i 오른쪽 과 같다 는 것 을 알 수 있 기 때문에 여러 가지 공식 을 얻 을 수 있다.
// = ( - i) 2
sumLeft = (sum - i)/2
//
sumLeft = sum - i - sumLeft
구현 코드 붙 이기:
/**
* @param {number[]} nums
* @return {number}
*/
var pivotIndex = function (nums) {
var i = 0,
len = nums.length,
sum = 0,
sumLeft = 0;
//
nums.map(item => sum += item);
// 0 , i 0 sumLeft+=nums[i]
for (; i < len; i++) {
if ((sum - nums[i]) / 2 === sumLeft) {
return i;
};
sumLeft += nums[i];
};
return -1;
};
사실 유일 하 게 주의해 야 할 것 은 바로 제 가 앞에서 말 한 구덩이 입 니 다.i 가 0 일 때 왼쪽 은 0 입 니 다.그래서 우 리 는 한 번 판단 한 후에 sumLeft+=nums[i]를 실 행 했 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JS 판단 수조 네 가지 실현 방법 상세그러면 본고는 주로 몇 가지 판단 방식과 방식 판단의 원리를 바탕으로 문제가 있는지 토론하고자 한다. 예를 들어 html에 여러 개의 iframe 대상이 있으면 instanceof의 검증 결과가 기대에 부합되지 않을...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.