553. 最优除法-数学推到法

553. 最优除法-数学推到法

给定一组正整数,相邻的整数之间将会进行浮点除法操作。例如, [2,3,4] -> 2 / 3 / 4 。

但是,你可以在任意位置添加任意数目的括号,来改变算数的优先级。你需要找出怎么添加括号,才能得到最大的结果,并且返回相应的字符串格式的表达式。你的表达式不应该含有冗余的括号。

示例:

输入: [1000,100,10,2]
输出: “1000/(100/10/2)”
解释:
1000/(100/10/2) = 1000/((100/10)/2) = 200
但是,以下加粗的括号 “1000/((100/10)/2)” 是冗余的,
因为他们并不影响操作的优先级,所以你需要返回 “1000/(100/10/2)”。

其他用例:
1000/(100/10)/2 = 50
1000/(100/(10/2)) = 50
1000/100/10/2 = 0.5
1000/100/(10/2) = 2

对于这个题目,博主想要说一点,因为每个数都大于1 ,多以只要一个数除以后面一个数只有可能更小或不变,那么我们需要做的是,找到一个最大的数,除以一个最小的数,也就是第一个数,出意后面的数加括号。
解题代码如下:



char * optimalDivision(int* nums, int numsSize){
    char *re=(char *)malloc(sizeof(char)*(numsSize*9));
    int size=0;
  
    for(int i=0;i<numsSize;i++){
        int val=nums[i];
           int r=0;
           int p=1000;
           
        for(int j=0;j<4;j++){
            int a=val/p;
            val=val%p;
           // printf("%d ",val);
            p=p/10;
            
         
            if(a!=0||r==1){
                r=1;
                re[size++]=a+'0';
            }
        }
        if(i==1&&numsSize==2){
                break;
            }
        if(numsSize==1){
            break;
        }
        if(i==0&&numsSize!=2){
             re[size++]='/';
             re[size++]='(';
        }
        else if(i==numsSize-1&&numsSize!=2){
            re[size++]=')';

        }
        else{
            re[size++]='/';

        }

    }
    re[size++]='\0';
    return re;
    

}

你可能感兴趣的:(c++与c语言,力扣刷题,算法,数据结构,c++)