페이스북 인터뷰 질문
지난 주 솔루션
이 챌린지에서 우리는
foodDistribution
에 arr
샌드위치를 포함하고 다양한 배고픔 수준arr
을 포함하는 N
숫자를 취하는 함수h1, h2, h3 ...
를 작성하라는 요청을 받았습니다. 우리의 목표는 사용 가능한 샌드위치를 사용하여 배열에 있는 각 쌍의 사람들 사이의 배고픔 차이를 최소화하는 것입니다.이 문제를 해결하려고 할 때 저에게 도움이 된 것은 코딩 전에 공격 계획을 단계별로 예를 들어 슈도코딩하는 것이었습니다.
arr = [5, 3, 1, 2, 1]
가 있는 시나리오에 대한 접근 방식을 살펴보겠습니다.접근 방식의 유사 코드:
N
와 배고픔 수준(배열의 나머지 모든 요소)을 추출합니다. N = 5, hungers = [3,1,2,1]
differences
를 계산할 수 있도록 이들sum
을 배열에 저장합니다. 우리는 차이를 최소화하기를 원하기 때문에 차이의 합에 주의를 기울입니다(굶주림 수준에 따라 균등한 분배를 촉진하기 위해). 아래 코드에서 도우미 메서드sum(array)
및 differences(array)
를 사용하여 이러한 값을 계산했습니다. diffs = [2, 1, 1], sum = 4
0
인 시나리오에 도달할 때까지 이 과정을 반복합니다. "최적"은 한 번에 하나의 샌드위치 분포와 배고픔 수준의 조합이 가장 낮은 차이 합계를 생성하는 것을 기준으로 계산됩니다. 예제 살펴보기:
N = 5, hungers = [3,1,2,1], diffs = [ 2, 1, 1], sumDiff = 4;
// Distribute one sandwich
N = 4;
// Possible combos
[2,1,2,1], diffs = [1,1,1], sumDiff = 3;
[3,0,2,1], diffs = [3,2,1], sumDiff = 6;
[3,1,1,1], diffs = [2,0,0], sumDiff = 2; // Optimal
[3,1,2,0], diffs = [2,1,2], sumDiff = 5;
// since sumDiff = 2 > 0 && N = 4 > 0, continue to distribute sandwiches
N = 3;
// Possible combos
[2,1,1,1], diffs = [1,0,0], sumDiff = 1; // Optimal
[3,0,1,1], diffs = [3,0,0], sumDiff = 3;
[3,1,0,1], diffs = [2,1,1], sumDiff = 4;
[3,1,1,0], diffs = [2,0,1], sumDiff = 3;
// since sumDiff = 1 > 0 && N = 3 > 0, continue to distribute sandwiches
N = 2;
// Possible combos
[1,1,1,1], diffs = [0,0,0], sumDiff = 0;// Optimal
[2,0,1,1], diffs = [2,1,0], sumDiff = 3;
[2,1,0,1]], diffs = [1,1,1], sumDiff = 3;
[2,1,1,0], diffs = [1,0,1], sumDiff = 2;
// Since sumDiff = 0, we can stop distributing sandwiches because we've reached equality across the pairs of hunger levels. By distributing 3 sandwiches we went from hunger levels of `[3,1,2,1]` to `[(3-2),1,(2-1),1] = [1,1,1,1]`.
// Return 0
자바스크립트 솔루션
function foodDistribution(arr) {
let N = arr.shift();
let hungers = arr;
let diffs = differences(hungers);
if (N >= diffs){ return 0 }
while (N > 0 && sum(diffs) > 0) {
let combos = [];
for (let i = 0; i < hungers.length; i++) {
let combo = hungers.slice();
combo[i]--;
combos.push(combo);
}
hungers = combos.reduce(minDiff);
N--;
diffs = differences(hungers);
}
return sum(diffs);
}
// HELPER METHODS
// Returns an array of differences across each pair
function differences(array) {
let diffs = [];
for (let i = 0; i < array.length - 1; i++) {
diffs.push(Math.abs(array[i] - array[i + 1]));
}
return diffs;
}
// Returns the sum of all values in an array (i.e. sum of all diffs)
function sum(array) {
return array.reduce((p, c) => p + c, 0);
}
// Compares two array and returns the array with the smallest sum of differences
function minDiff(arr1, arr2) {
if(sum(differences(arr1)) <= sum(differences(arr2))){
return arr1;
} else {
return arr2;
}
}
// GIVEN TEST CASES
console.log(foodDistribution([5, 3, 1, 2, 1])); // return 0 b/c you distribute 5 sandwiches as 2, 0, 1, 0, making hunger levels [1, 1, 1, 1]
console.log(foodDistribution([5, 2, 3, 4, 5])); // return 1 b/c you distribute 5 sandwiches as 2, 2, 1, 0 making hunger levels [4,5,5,5]
console.log(foodDistribution([3, 2, 1, 0, 4, 1, 0])); // return 4
// ADDITIONAL TEST CASES
console.log(foodDistribution([1, 5, 4, 1])); // return 3
console.log(foodDistribution([20, 5, 4, 1])); // return 0
console.log(foodDistribution([5, 4, 2, 5, 1, 1])); // return 1
console.log(foodDistribution([12, 5, 5, 5, 5, 5])); // return 0
이것이 제가 이 문제를 해결하기 위해 취한 접근 방식을 마무리합니다. 당신의 생각은 무엇입니까? 이것은 시간 및 공간 복잡성 측면에서 어떻게 수행됩니까? 이 솔루션을 개선할 방법이 있습니까? 아래 의견에서 귀하의 생각을 듣고 싶습니다.
이번 주 챌린지
우리는 Facebook 인터뷰에서 요청된 문제에 초점을 맞추고 있으며 이진 트리에 대한 우리의 이해를 테스트하고 있습니다.
이번 주에 우리는
treeConstructor
형식의 정수 쌍을 포함하는 문자열 배열인 strArr
를 받는 함수 (i1,i2)
를 작성하라는 요청을 받았습니다. 여기서 i1
는 트리의 자식 노드를 나타냅니다. 두 번째 정수i2
는 i1
의 부모임을 나타냅니다.예를 들어
strArr
가 ["(1,2)", "(2,4)", "(7,2)"]
인 경우 다음 트리를 형성합니다.이것은 이진 트리이므로 유효한 이진 트리를 형성할 수 있으므로 함수가 반환되어야 합니다
true
. 정수 쌍으로 적절한 이진 트리를 형성할 수 없는 경우 false
를 반환합니다.우리는 트리 내의 모든 정수가 고유하다고 가정할 수 있습니다. 즉, 주어진 정수 값을 가진 트리의 노드는 하나만 있을 수 있습니다.
추가 예시:
["(1,2)", "(2,4)", "(5,7)", "(7,2)", "(9,5)"]
, 출력: true
["(1,2)", "(1,3)"]
, 출력: false
이 문제를 해결하기 위한 귀하의 접근 방식은 무엇입니까?
아래에서 이 챌린지에 대한 생각을 공유해 주세요. 우리는 당신이 어떤 해결책을 제시하는지 알고 싶습니다. 그 동안 500,000명 이상의 개발자가 인터뷰를 준비하는 데 도움을 준 인터뷰 준비 플랫폼인 Coderbyte에서 무료 계정에 가입하면 액세스할 수 있는 무료 10일 이메일 인터뷰 준비 과정을 확인하십시오.
다음주에 보자!
사진 제공: Emile Perron on Unsplash
Reference
이 문제에 관하여(페이스북 인터뷰 질문), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/coderbyte/a-facebook-interview-question-14b1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)