Yasin Efe
BAN USER
http://uk.linkedin.com/in/yasinefe
I used Arrays.sort function, because everyone knows how sorting can be done.
public class NumberDictionary {
public int findRank(char[] arr, String number) {
sort(arr);
int length = arr.length;
int rank = 0;
int count = length - 1;
for (int i = 0; i < length; i++) {
char chr = number.charAt(i);
for (int j = 0; j < arr.length; j++) {
if (arr[j] == chr) {
rank = rank + j * factorial(count);
arr = remove(arr, chr);
count--;
break;
}
}
}
return rank + 1;
}
private char[] remove(char[] arr, char chr) {
char[] newArr = new char[arr.length - 1];
int index = 0;
for (int i = 0; i < arr.length; i++) {
if (chr != arr[i]) {
newArr[index] = arr[i];
index++;
}
}
return newArr;
}
private int factorial(int i) {
if (i <= 1) {
return 1;
}
return factorial(i - 1) * i;
}
private void sort(char[] arr) {
Arrays.sort(arr);
}
}
This is the test cases :
public class NumberDictionaryTest {
private NumberDictionary numberDictionary;
@Before
public void setup() {
numberDictionary = new NumberDictionary();
}
@Test
public void test() {
assertEquals(1, numberDictionary.findRank(getArr('a'), "a"));
assertEquals(1, numberDictionary.findRank(getArr('a', 'b'), "ab"));
assertEquals(1, numberDictionary.findRank(getArr('b', 'a'), "ab"));
assertEquals(2, numberDictionary.findRank(getArr('b', 'a'), "ba"));
assertEquals(6, numberDictionary.findRank(getArr('a', 'b', 'c'), "cba"));
assertEquals(14, numberDictionary.findRank(getArr('a', 'd', 'c', 'b'), "cadb"));
assertEquals(2, numberDictionary.findRank(getArr('a', 'd', 'c', 'b'), "abdc"));
assertEquals(24, numberDictionary.findRank(getArr('a', 'd', 'c', 'b'), "dcba"));
assertEquals(10, numberDictionary.findRank(getArr('a', 'd', 'c', 'b'), "bcda"));
}
private char[] getArr(char... arrs) {
return arrs;
}
}
Hi,
Here is my implementation with Java.
I assumed that :
1. Given expression is valid, which means all open brackets are closed.
2. Given expression can not be null.
3. Given expression does not contain negatives. (-a + b) negative a is not possible.
Here is the main class :
public class RemoveUselessBracketsInExpression {
public String removeBrackets(String expression) {
String cleanExpression = removeSpaces(expression);
String result = remove(cleanExpression);
return result;
}
private String remove(String expression) {
Tree tree = createExpressionTree(expression);
walkOnTreeAndRemoveBrackets(tree.head);
return createExpressionFromNode(tree.head);
}
private Tree createExpressionTree(String expression) {
Tree tree = new Tree();
tree.head = trimBracketsAndCreateNode(expression);
return tree;
}
private void walkOnTreeAndRemoveBrackets(Node node) {
node.hasBrackets = false;
hasInnerExpressionWithDifferentOperator(node);
}
private String createExpressionFromNode(Node node) {
StringBuilder sb = new StringBuilder();
if (node.hasBrackets) {
sb.append("(");
}
if (node.operator != 0) {
sb.append(createExpressionFromNode(node.left));
sb.append(node.operator);
sb.append(createExpressionFromNode(node.right));
} else {
sb.append(node.expression);
}
if (node.hasBrackets) {
sb.append(")");
}
return sb.toString();
}
private void hasInnerExpressionWithDifferentOperator(Node node) {
if (node.operator != 0) {
if (node.operator == node.left.operator
|| getPrecedence(node.operator) <= getPrecedence(node.left.operator)) {
node.left.hasBrackets = false;
}
if (node.operator == node.right.operator
|| getPrecedence(node.operator) <= getPrecedence(node.right.operator)) {
node.right.hasBrackets = false;
}
hasInnerExpressionWithDifferentOperator(node.left);
hasInnerExpressionWithDifferentOperator(node.right);
}
}
private Node trimBracketsAndCreateNode(String expression) {
boolean hasBrackets = false;
boolean contuniue = true;
String trimmedExpression = expression;
while (contuniue) {
hasBrackets = checkHasBrackets(trimmedExpression);
if (hasBrackets) {
trimmedExpression = trimmedExpression.substring(1, trimmedExpression.length() - 1);
}
if (!checkHasBrackets(trimmedExpression)) {
contuniue = false;
}
}
return createNode(trimmedExpression, hasBrackets);
}
private Node createNode(String expression, boolean hasBrackets) {
System.out.println(expression);
int operatorIndex = getOperatorIndex(expression);
Node node = new Node();
node.expression = expression;
if (operatorIndex != -1) {
node.operator = expression.charAt(operatorIndex);
}
if (operatorIndex == -1) {
node.hasBrackets = false;
} else {
node.hasBrackets = hasBrackets;
}
if (operatorIndex != -1) {
node.left = trimBracketsAndCreateNode(expression.substring(0, operatorIndex));
node.right = trimBracketsAndCreateNode(expression.substring(operatorIndex + 1));
}
return node;
}
private boolean checkHasBrackets(String expression) {
int openBrackets = 0;
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == '(') {
openBrackets++;
}
if (c == ')') {
openBrackets--;
}
if (openBrackets == 0 && i < expression.length() - 1) {
return false;
}
}
return expression.charAt(0) == '(' && expression.charAt(expression.length() - 1) == ')';
}
private int getOperatorIndex(String expression) {
int openBrackets = 0;
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == '(') {
openBrackets++;
}
if (c == ')') {
openBrackets--;
}
if (openBrackets == 0) {
if (c == '-' || c == '+' || c == '*' || c == '/') {
return i;
}
}
}
return -1;
}
private String removeSpaces(String expression) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c != ' ') {
sb.append(c);
}
}
return sb.toString();
}
private int getPrecedence(char operator) {
switch (operator) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return -1;
}
}
class Tree {
Node head;
}
class Node {
Node left;
Node right;
String expression;
boolean hasBrackets;
char operator;
}
}
I tested this implementation with these cases :
(testing more than one case in a test is not practical, but I preferred to keep simple for this page)
public class RemoveUselessBracketsInExpressionTest {
private RemoveUselessBracketsInExpression ru;
@Before
public void setup() {
ru = new RemoveUselessBracketsInExpression();
}
@Test
public void test01() {
assertEquals("a", ru.removeBrackets("a"));
assertEquals("a", ru.removeBrackets(" a "));
assertEquals("a+b", ru.removeBrackets(" (a + b) "));
assertEquals("a+b+c", ru.removeBrackets(" ( a + ( b + c ) ) "));
assertEquals("a+b+c+d", ru.removeBrackets(" ( ( a + b ) + ( c + d ) ) "));
assertEquals("(a+b)*(c+d)", ru.removeBrackets(" ( ( a + b ) * ( c + d ) ) "));
assertEquals("a*(b+c)", ru.removeBrackets(" ( a * ( b + c ) ) "));
assertEquals("a-b*(c+d)", ru.removeBrackets(" ( a - b * ( c + d ) ) "));
assertEquals("a-b*c+d", ru.removeBrackets("a - b * c + d"));
assertEquals("a-b*c*d", ru.removeBrackets("a - b * (c * d)"));
assertEquals("a-b*c*d/e", ru.removeBrackets("a - b * c * (d / e)"));
assertEquals("a-b*c*d/e", ru.removeBrackets("a - (b * c) * (d / e)"));
assertEquals("a-(b+c)*d/e", ru.removeBrackets("a - (b + c) * (d / e)"));
assertEquals("(a-b+c)*d/e", ru.removeBrackets("(a - b + c) * (d / e)"));
assertEquals("(a-b+c)*d/e", ru.removeBrackets("(a - (b) + c) * (d / e)"));
assertEquals("a+b-c+d/e", ru.removeBrackets("(a + (b - c) + (d / e))"));
assertEquals("a+b-c+d/e", ru.removeBrackets("(a + ((b - c)) + (d / e))"));
assertEquals("a+b-c*d/e", ru.removeBrackets("a + b - c * d / e"));
assertEquals("(a*b-c)/(d-e)", ru.removeBrackets("((a * b) - c) / (d - e)"));
assertEquals("(a-b+c)/d-e", ru.removeBrackets("((a - b) + (c)) / d - e"));
assertEquals("(a+b*c)*d*f*j", ru.removeBrackets("(a + (b*c)) * (d * ( f * j) ) "));
}
}
Hi,
Here is my implementation with Java.
I assumed that :
1. Given expression is valid, which means all open brackets are closed.
2. Given expression can not be null.
3. Given expression does not contain negatives. (-a + b) negative a is not possible.
Here is the main class :
public class RemoveUselessBracketsInExpression {
public String removeBrackets(String expression) {
String cleanExpression = removeSpaces(expression);
String result = remove(cleanExpression);
return result;
}
private String remove(String expression) {
Tree tree = createExpressionTree(expression);
walkOnTreeAndRemoveBrackets(tree.head);
return createExpressionFromNode(tree.head);
}
private Tree createExpressionTree(String expression) {
Tree tree = new Tree();
tree.head = trimBracketsAndCreateNode(expression);
return tree;
}
private void walkOnTreeAndRemoveBrackets(Node node) {
node.hasBrackets = false;
hasInnerExpressionWithDifferentOperator(node);
}
private String createExpressionFromNode(Node node) {
StringBuilder sb = new StringBuilder();
if (node.hasBrackets) {
sb.append("(");
}
if (node.operator != 0) {
sb.append(createExpressionFromNode(node.left));
sb.append(node.operator);
sb.append(createExpressionFromNode(node.right));
} else {
sb.append(node.expression);
}
if (node.hasBrackets) {
sb.append(")");
}
return sb.toString();
}
private void hasInnerExpressionWithDifferentOperator(Node node) {
if (node.operator != 0) {
if (node.operator == node.left.operator
|| getPrecedence(node.operator) <= getPrecedence(node.left.operator)) {
node.left.hasBrackets = false;
}
if (node.operator == node.right.operator
|| getPrecedence(node.operator) <= getPrecedence(node.right.operator)) {
node.right.hasBrackets = false;
}
hasInnerExpressionWithDifferentOperator(node.left);
hasInnerExpressionWithDifferentOperator(node.right);
}
}
private Node trimBracketsAndCreateNode(String expression) {
boolean hasBrackets = false;
boolean contuniue = true;
String trimmedExpression = expression;
while (contuniue) {
hasBrackets = checkHasBrackets(trimmedExpression);
if (hasBrackets) {
trimmedExpression = trimmedExpression.substring(1, trimmedExpression.length() - 1);
}
if (!checkHasBrackets(trimmedExpression)) {
contuniue = false;
}
}
return createNode(trimmedExpression, hasBrackets);
}
private Node createNode(String expression, boolean hasBrackets) {
System.out.println(expression);
int operatorIndex = getOperatorIndex(expression);
Node node = new Node();
node.expression = expression;
if (operatorIndex != -1) {
node.operator = expression.charAt(operatorIndex);
}
if (operatorIndex == -1) {
node.hasBrackets = false;
} else {
node.hasBrackets = hasBrackets;
}
if (operatorIndex != -1) {
node.left = trimBracketsAndCreateNode(expression.substring(0, operatorIndex));
node.right = trimBracketsAndCreateNode(expression.substring(operatorIndex + 1));
}
return node;
}
private boolean checkHasBrackets(String expression) {
int openBrackets = 0;
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == '(') {
openBrackets++;
}
if (c == ')') {
openBrackets--;
}
if (openBrackets == 0 && i < expression.length() - 1) {
return false;
}
}
return expression.charAt(0) == '(' && expression.charAt(expression.length() - 1) == ')';
}
private int getOperatorIndex(String expression) {
int openBrackets = 0;
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == '(') {
openBrackets++;
}
if (c == ')') {
openBrackets--;
}
if (openBrackets == 0) {
if (c == '-' || c == '+' || c == '*' || c == '/') {
return i;
}
}
}
return -1;
}
private String removeSpaces(String expression) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c != ' ') {
sb.append(c);
}
}
return sb.toString();
}
private int getPrecedence(char operator) {
switch (operator) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return -1;
}
}
class Tree {
Node head;
}
class Node {
Node left;
Node right;
String expression;
boolean hasBrackets;
char operator;
}
}
I tested this implementation with these cases :
(testing more than one case in a test is not practical, but I preferred to keep simple for this page)
public class RemoveUselessBracketsInExpressionTest {
private RemoveUselessBracketsInExpression ru;
@Before
public void setup() {
ru = new RemoveUselessBracketsInExpression();
}
@Test
public void test01() {
assertEquals("a", ru.removeBrackets("a"));
assertEquals("a", ru.removeBrackets(" a "));
assertEquals("a+b", ru.removeBrackets(" (a + b) "));
assertEquals("a+b+c", ru.removeBrackets(" ( a + ( b + c ) ) "));
assertEquals("a+b+c+d", ru.removeBrackets(" ( ( a + b ) + ( c + d ) ) "));
assertEquals("(a+b)*(c+d)", ru.removeBrackets(" ( ( a + b ) * ( c + d ) ) "));
assertEquals("a*(b+c)", ru.removeBrackets(" ( a * ( b + c ) ) "));
assertEquals("a-b*(c+d)", ru.removeBrackets(" ( a - b * ( c + d ) ) "));
assertEquals("a-b*c+d", ru.removeBrackets("a - b * c + d"));
assertEquals("a-b*c*d", ru.removeBrackets("a - b * (c * d)"));
assertEquals("a-b*c*d/e", ru.removeBrackets("a - b * c * (d / e)"));
assertEquals("a-b*c*d/e", ru.removeBrackets("a - (b * c) * (d / e)"));
assertEquals("a-(b+c)*d/e", ru.removeBrackets("a - (b + c) * (d / e)"));
assertEquals("(a-b+c)*d/e", ru.removeBrackets("(a - b + c) * (d / e)"));
assertEquals("(a-b+c)*d/e", ru.removeBrackets("(a - (b) + c) * (d / e)"));
assertEquals("a+b-c+d/e", ru.removeBrackets("(a + (b - c) + (d / e))"));
assertEquals("a+b-c+d/e", ru.removeBrackets("(a + ((b - c)) + (d / e))"));
assertEquals("a+b-c*d/e", ru.removeBrackets("a + b - c * d / e"));
assertEquals("(a*b-c)/(d-e)", ru.removeBrackets("((a * b) - c) / (d - e)"));
assertEquals("(a-b+c)/d-e", ru.removeBrackets("((a - b) + (c)) / d - e"));
assertEquals("(a+b*c)*d*f*j", ru.removeBrackets("(a + (b*c)) * (d * ( f * j) ) "));
}
}
Hi,
Here is my implementation with Java.
I assumed that :
1. Given expression is valid, which means all open brackets are closed.
2. Given expression can not be null.
3. Given expression does not contain negatives. (-a + b) negative a is not possible.
Here is the main class :
public class RemoveUselessBracketsInExpression {
public String removeBrackets(String expression) {
String cleanExpression = removeSpaces(expression);
String result = remove(cleanExpression);
return result;
}
private String remove(String expression) {
Tree tree = createExpressionTree(expression);
walkOnTreeAndRemoveBrackets(tree.head);
return createExpressionFromNode(tree.head);
}
private Tree createExpressionTree(String expression) {
Tree tree = new Tree();
tree.head = trimBracketsAndCreateNode(expression);
return tree;
}
private void walkOnTreeAndRemoveBrackets(Node node) {
node.hasBrackets = false;
hasInnerExpressionWithDifferentOperator(node);
}
private String createExpressionFromNode(Node node) {
StringBuilder sb = new StringBuilder();
if (node.hasBrackets) {
sb.append("(");
}
if (node.operator != 0) {
sb.append(createExpressionFromNode(node.left));
sb.append(node.operator);
sb.append(createExpressionFromNode(node.right));
} else {
sb.append(node.expression);
}
if (node.hasBrackets) {
sb.append(")");
}
return sb.toString();
}
private void hasInnerExpressionWithDifferentOperator(Node node) {
if (node.operator != 0) {
if (node.operator == node.left.operator
|| getPrecedence(node.operator) <= getPrecedence(node.left.operator)) {
node.left.hasBrackets = false;
}
if (node.operator == node.right.operator
|| getPrecedence(node.operator) <= getPrecedence(node.right.operator)) {
node.right.hasBrackets = false;
}
hasInnerExpressionWithDifferentOperator(node.left);
hasInnerExpressionWithDifferentOperator(node.right);
}
}
private Node trimBracketsAndCreateNode(String expression) {
boolean hasBrackets = false;
boolean contuniue = true;
String trimmedExpression = expression;
while (contuniue) {
hasBrackets = checkHasBrackets(trimmedExpression);
if (hasBrackets) {
trimmedExpression = trimmedExpression.substring(1, trimmedExpression.length() - 1);
}
if (!checkHasBrackets(trimmedExpression)) {
contuniue = false;
}
}
return createNode(trimmedExpression, hasBrackets);
}
private Node createNode(String expression, boolean hasBrackets) {
System.out.println(expression);
int operatorIndex = getOperatorIndex(expression);
Node node = new Node();
node.expression = expression;
if (operatorIndex != -1) {
node.operator = expression.charAt(operatorIndex);
}
if (operatorIndex == -1) {
node.hasBrackets = false;
} else {
node.hasBrackets = hasBrackets;
}
if (operatorIndex != -1) {
node.left = trimBracketsAndCreateNode(expression.substring(0, operatorIndex));
node.right = trimBracketsAndCreateNode(expression.substring(operatorIndex + 1));
}
return node;
}
private boolean checkHasBrackets(String expression) {
int openBrackets = 0;
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == '(') {
openBrackets++;
}
if (c == ')') {
openBrackets--;
}
if (openBrackets == 0 && i < expression.length() - 1) {
return false;
}
}
return expression.charAt(0) == '(' && expression.charAt(expression.length() - 1) == ')';
}
private int getOperatorIndex(String expression) {
int openBrackets = 0;
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == '(') {
openBrackets++;
}
if (c == ')') {
openBrackets--;
}
if (openBrackets == 0) {
if (c == '-' || c == '+' || c == '*' || c == '/') {
return i;
}
}
}
return -1;
}
private String removeSpaces(String expression) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c != ' ') {
sb.append(c);
}
}
return sb.toString();
}
private int getPrecedence(char operator) {
switch (operator) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return -1;
}
}
class Tree {
Node head;
}
class Node {
Node left;
Node right;
String expression;
boolean hasBrackets;
char operator;
}
}
I tested this implementation with these cases :
(testing more than one case in a test is not practical, but I preferred to keep simple for this page)
public class RemoveUselessBracketsInExpressionTest {
private RemoveUselessBracketsInExpression ru;
@Before
public void setup() {
ru = new RemoveUselessBracketsInExpression();
}
@Test
public void test01() {
assertEquals("a", ru.removeBrackets("a"));
assertEquals("a", ru.removeBrackets(" a "));
assertEquals("a+b", ru.removeBrackets(" (a + b) "));
assertEquals("a+b+c", ru.removeBrackets(" ( a + ( b + c ) ) "));
assertEquals("a+b+c+d", ru.removeBrackets(" ( ( a + b ) + ( c + d ) ) "));
assertEquals("(a+b)*(c+d)", ru.removeBrackets(" ( ( a + b ) * ( c + d ) ) "));
assertEquals("a*(b+c)", ru.removeBrackets(" ( a * ( b + c ) ) "));
assertEquals("a-b*(c+d)", ru.removeBrackets(" ( a - b * ( c + d ) ) "));
assertEquals("a-b*c+d", ru.removeBrackets("a - b * c + d"));
assertEquals("a-b*c*d", ru.removeBrackets("a - b * (c * d)"));
assertEquals("a-b*c*d/e", ru.removeBrackets("a - b * c * (d / e)"));
assertEquals("a-b*c*d/e", ru.removeBrackets("a - (b * c) * (d / e)"));
assertEquals("a-(b+c)*d/e", ru.removeBrackets("a - (b + c) * (d / e)"));
assertEquals("(a-b+c)*d/e", ru.removeBrackets("(a - b + c) * (d / e)"));
assertEquals("(a-b+c)*d/e", ru.removeBrackets("(a - (b) + c) * (d / e)"));
assertEquals("a+b-c+d/e", ru.removeBrackets("(a + (b - c) + (d / e))"));
assertEquals("a+b-c+d/e", ru.removeBrackets("(a + ((b - c)) + (d / e))"));
assertEquals("a+b-c*d/e", ru.removeBrackets("a + b - c * d / e"));
assertEquals("(a*b-c)/(d-e)", ru.removeBrackets("((a * b) - c) / (d - e)"));
assertEquals("(a-b+c)/d-e", ru.removeBrackets("((a - b) + (c)) / d - e"));
assertEquals("(a+b*c)*d*f*j", ru.removeBrackets("(a + (b*c)) * (d * ( f * j) ) "));
}
}
This is the recursive solution. It returns size of the largest set.
1. Calculate sum of the array.
2. If the total is zero, return j - i means sub set size. i and j can be returned to have sub set of array.
3. Call same method recursively (2. step) with subset of [i] to [j -1] and [i + 1] to [j], return max size of sub set
These are the tests
- Yasin Efe May 21, 2014