페이스북 인터뷰 질문
지난 주 솔루션
이 챌린지에서 우리는
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.)