I'm a little rusty in Java, but I'm using it to get ready for interviews. Here's the problem description from HackerRank:
Problem Statement
Suppose you have a string \$S\$ which has length \$N\$ and is indexed from \$0\$ to \$N−1\$. String \$R\$ is the reverse of the string \$S\$. The string \$S\$ is funny if the condition \$|S_i−S_{i−1}|=|R_i−R_{i−1}|\$ is true for every \$i\$ from 1 to \$N−1\$.
(Note: Given a string str, stri denotes the ascii value of the ith character (0-indexed) of str. |x| denotes the absolute value of an integer x)
Input Format
First line of the input will contain an integer T. T testcases follow. Each of the next T lines contains one string S.
Constraints
- \$1 \le T \le 10\$
- \$2 \le\$ length of S \$\le 10000\$
Output Format
For each string, print Funny or Not Funny in separate lines.
This passing solution took me about 20 minutes, so that might be a bit long given the difficulty of the problem. I'm open to critiques on my speed too.
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
private static boolean isFunny (String s)
{
String rev = reverse(s);
boolean stillEq = true;
for (int i = 2; i < s.length() && stillEq; ++i)
{
int comp = (int)s.charAt(i) - (int)s.charAt(i-1);
int comp2 = (int)rev.charAt(i) - (int)rev.charAt(i-1);
stillEq = Math.abs(comp) == Math.abs(comp2);
}
if (stillEq)
return true;
else
return false;
}
private static String reverse (String s)
{
if (s.length() > 0)
return s.charAt(s.length()-1) + reverse(s.substring(0, s.length()-1));
else
return "";
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int tests = sc.nextInt();
for (int i = 0; i < tests; ++i)
{
String out = isFunny(sc.next()) ? "Funny" : "Not Funny";
System.out.println( out );
}
}