package com.coding.me.leetcode.algorithms; /** * Given a list of positive integers, the adjacent integers will perform the * float division. For example, [2,3,4] -> 2 / 3 / 4. * * However, you can add any number of parenthesis at any position to change the * priority of operations. You should find out how to add parenthesis to get the * maximum result, and return the corresponding expression in string format. * Your expression should NOT contain redundant parenthesis. * * Example: Input: [1000,100,10,2] Output: "1000/(100/10/2)" Explanation: * 1000/(100/10/2) = 1000/((100/10)/2) = 200 However, the bold parenthesis in * "1000/((100/10)/2)" are redundant, since they don't influence the operation * priority. So you should return "1000/(100/10/2)". * * Other cases: 1000/(100/10)/2 = 50 1000/(100/(10/2)) = 50 1000/100/10/2 = 0.5 * 1000/100/(10/2) = 2 Note: * * The length of the input array is [1, 10]. Elements in the given array will be * in range [2, 1000]. There is only one optimal division for each test case. * * @author hewj * */ public class OptimalDivision { public static String mySolution(int[] nums) { if(nums.length == 0 || nums.length > 10) { return ""; } if(nums.length == 1) { return "" + nums[0]; } straightInsertionSort(nums); StringBuilder sb = new StringBuilder(); sb.append(nums[0]).append("/"); if(nums.length == 2){ sb.append(nums[1]); }else{ sb.append("("); for(int k=1;k<nums.length;k++){ sb.append(nums[k]); if(k == nums.length - 1){ sb.append(")"); }else{ sb.append("/"); } } } return sb.toString(); } private static void straightInsertionSort(int[] nums) { for(int i=0;i<nums.length;i++){ int max = nums[i]; int pos = i; for(int j=i+1;j<nums.length;j++){ if(max < nums[j]){ max = nums[j]; pos = j; } } if(pos != i) { int tmp = nums[i]; nums[i] = nums[pos]; nums[pos] = tmp; } } } public static void main(String[] args) { int[] nums = {1000,100,2,10}; mySolution(nums); } }