forked from TheAlgorithms/Java
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Add
CelebrityFinder
new algorithm with Junit tests (TheAlgori…
- Loading branch information
Showing
3 changed files
with
95 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
52 changes: 52 additions & 0 deletions
52
src/main/java/com/thealgorithms/stacks/CelebrityFinder.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
package com.thealgorithms.stacks; | ||
|
||
import java.util.Stack; | ||
|
||
/** | ||
* Solves the celebrity problem using a stack-based algorithm. | ||
* | ||
* <p>Celebrity is someone known by everyone but doesn't know anyone else. | ||
* <p>Applications: Graph theory and social network analysis. | ||
* | ||
* @author Hardvan | ||
*/ | ||
public final class CelebrityFinder { | ||
private CelebrityFinder() { | ||
} | ||
|
||
/** | ||
* Finds the celebrity in the given party matrix using a stack-based algorithm. | ||
* | ||
* @param party A 2D matrix where party[i][j] is 1 if i knows j, otherwise 0. | ||
* @return The index of the celebrity, or -1 if there is no celebrity. | ||
*/ | ||
public static int findCelebrity(int[][] party) { | ||
|
||
// Push all people onto the stack | ||
Stack<Integer> stack = new Stack<>(); | ||
for (int i = 0; i < party.length; i++) { | ||
stack.push(i); | ||
} | ||
|
||
// Find the potential celebrity by comparing pairs | ||
while (stack.size() > 1) { | ||
int person1 = stack.pop(); | ||
int person2 = stack.pop(); | ||
|
||
if (party[person1][person2] == 1) { | ||
stack.push(person2); // person1 knows person2, so person2 might be the celebrity | ||
} else { | ||
stack.push(person1); // person1 doesn't know person2, so person1 might be the celebrity | ||
} | ||
} | ||
|
||
// Verify the candidate | ||
int candidate = stack.pop(); | ||
for (int i = 0; i < party.length; i++) { | ||
if (i != candidate && (party[candidate][i] == 1 || party[i][candidate] == 0)) { | ||
return -1; | ||
} | ||
} | ||
return candidate; | ||
} | ||
} |
41 changes: 41 additions & 0 deletions
41
src/test/java/com/thealgorithms/stacks/CelebrityFinderTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package com.thealgorithms.stacks; | ||
|
||
import static org.junit.jupiter.api.Assertions.assertEquals; | ||
|
||
import java.util.stream.Stream; | ||
import org.junit.jupiter.params.ParameterizedTest; | ||
import org.junit.jupiter.params.provider.Arguments; | ||
import org.junit.jupiter.params.provider.MethodSource; | ||
|
||
public class CelebrityFinderTest { | ||
|
||
@ParameterizedTest | ||
@MethodSource("providePartyMatrices") | ||
public void testCelebrityFinder(int[][] party, int expected) { | ||
assertEquals(expected, CelebrityFinder.findCelebrity(party)); | ||
} | ||
|
||
private static Stream<Arguments> providePartyMatrices() { | ||
return Stream.of( | ||
// Test case 1: Celebrity exists | ||
Arguments.of(new int[][] {{0, 1, 1}, {0, 0, 1}, {0, 0, 0}}, 2), | ||
|
||
// Test case 2: No celebrity | ||
Arguments.of(new int[][] {{0, 1, 0}, {1, 0, 1}, {1, 1, 0}}, -1), | ||
|
||
// Test case 3: Everyone knows each other, no celebrity | ||
Arguments.of(new int[][] {{0, 1, 1}, {1, 0, 1}, {1, 1, 0}}, -1), | ||
|
||
// Test case 4: Single person, they are trivially a celebrity | ||
Arguments.of(new int[][] {{0}}, 0), | ||
|
||
// Test case 5: All know the last person, and they know no one | ||
Arguments.of(new int[][] {{0, 1, 1, 1}, {0, 0, 1, 1}, {0, 0, 0, 1}, {0, 0, 0, 0}}, 3), | ||
|
||
// Test case 6: Larger party with no celebrity | ||
Arguments.of(new int[][] {{0, 1, 1, 0}, {1, 0, 0, 1}, {0, 1, 0, 1}, {1, 1, 1, 0}}, -1), | ||
|
||
// Test case 7: Celebrity at the start of the matrix | ||
Arguments.of(new int[][] {{0, 0, 0}, {1, 0, 1}, {1, 1, 0}}, 0)); | ||
} | ||
} |