알 리 바 바 그룹 2017 여름 실습 자바 연구개 발 엔지니어 온라인 프로 그래 밍 문제
4982 단어 일자 리 를 구하 다
사고: 1. 배열 을 먼저 2 등분 하고 l, r 로 기록 합 니 다. 그 중에서 l 은 수치 첫 번 째 요소 로 표 시 됩 니 다. r 는 배열 의 마지막 요소 로 표 시 됩 니 다.2. l 을 확대 하거나 r 를 줄 여 좌우 두 단락 을 똑 같이 하고 lsum 이 라 고 기록 하 며 똑 같 지 않 으 면 구분 할 수 없고 그렇지 않 으 면 세 번 째 단 계 를 진행한다.3. 남 은 중간 배열 의 동 리 를 세그먼트 로 나 누 어 ml = l + 2;mr = r-2。두 번 째 단계 와 유사 한 조작 을 하여 좌우 두 단락 이 같은 합 을 얻어 mlsum 이 라 고 기록 합 니 다.4. lsum = = mlsum 이면 나 눌 수 있 고 그렇지 않 으 면 나 눌 수 없다.다음은 코드:
package com.alibaba.interview;
public class FourPoint {
public static boolean isFourPoint(int[] a) {
//
int l = 0, r = a.length - 1;
int lsum = a[0], rsum = a[a.length - 1];
//
while (true) {
// ,
if (l == r) {
return false;
}
if (lsum > rsum) {
--r;
rsum = rsum + a[r];
} else if (lsum < rsum) {
l++;
lsum = lsum + a[l];
} else {
break;
}
}
//
int ml = l + 2;
int mr = r - 2;
int mlsum = a[ml];
int mrsum = a[mr];
while (true) {
// ,
if (ml == mr) {
return false;
}
if (mlsum > mrsum) {
--mr;
mrsum = mrsum + a[mr];
} else if (mlsum < mrsum) {
ml++;
mlsum = mlsum + a[ml];
} else {
break;
}
}
if (mlsum == lsum) {
l++;
ml++;
r--;
System.out.println(" :" + a[l] + "," + a[ml] + "," + a[r]);
return true;
}
return false;
}
public static void main(String[] args) {
int[] a = { 2, 5,1, 1, 4, 1, 7, 3, 7 };
if (FourPoint.isFourPoint(a)) {
System.out.println(" ");
} else {
System.out.println(" ");
}
}
}