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 |Si−Si−1|=|Ri−Ri−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<=T<=10
2<=length of S<=10000
Output Format
For each string, print Funny or Not Funny in separate lines.
Below is my passing solution. This 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 );
}
}