最大乘积的N-1项,只用乘法不能用除法 (Java)实现

package algorithm.misc;

import util.*;

public class MaxProductOfN1 {

    private static int exceptIndex = -1;
   
    public static long regMethod(int data[])
    {
        long ret = Long.MIN_VALUE;
        long tmp = 1;
        for(int i = 0; i < data.length; i++)
        {
            tmp = 1;
            for(int j = 0; j < data.length; j++)
            {
                if(j != i)
                {
                    tmp *= data[j];
                }
            }
            if(tmp > ret)
            {
                ret = tmp;
                exceptIndex = i;
            }
        }
        return ret;
    }
   
    public static long dp(int data[])
    {
        long ascent[] = new long[data.length + 1];
       
        ascent[0] = 1;   
        for(int i = 0; i < data.length; i++)
        {
            ascent[i + 1] = ascent[i] * data[i];
        }
       
       
        long descent[] = new long[data.length + 1];
       
        descent[0] = 1;   
        for(int i = 0; i < data.length; i++)
        {
            descent[i + 1] = descent[i] * data[data.length - i - 1];
        }
       
        long ret = Long.MIN_VALUE;
        long tmp = 1;
       
        for(int i = 0; i < data.length; i++)
        {
            tmp = ascent[i] * descent[data.length - i - 1];
           
            if(tmp > ret)
            {
                ret = tmp;
                exceptIndex = i;
            }
        }
       
        return ret;
    }
   
   
    public static long analyse(int data[])
    {
        long ret = 1;
       
        int numOfPos = 0, numOfNeg = 0, numOfZero = 0;
       
        for(int i = 0; i < data.length; i++)
        {
            if(data[i] == 0)
            {
                numOfZero++;
            }
            else if(data[i] > 0)
            {
                numOfPos++;
            }
            else
            {
                numOfNeg++;
            }
        }
       
        int index = -1;
        //There are zeros
        if(numOfZero > 0)
        {
            //More than 2 zeros
            if(numOfZero > 1)
            {
                exceptIndex = 0;
                return 0;
            }
            //Only 1 zero
            else
            {
                //The number of negative number is even.
                if(numOfNeg % 2 == 0)
                {
                    index = getIndex(data, 0);
                    exceptIndex = index;
                    return multipleExcept(data, index);
                }
                //odd
                else
                {
                    exceptIndex = 0;
                    return 0;
                }
            }
        }
        else if(numOfNeg % 2 == 1)
        {
            index = -1;

            int maxNegValue = Integer.MIN_VALUE;
            for(int i = 0; i < data.length; i++)
            {
                if(data[i] < 0 && data[i] > maxNegValue)
                {
                    maxNegValue = data[i];
                    index = i;
                }
            }
            exceptIndex = index;
            return multipleExcept(data, index);
        }
        else
        {
            index = -1;

            int minPosValue = Integer.MAX_VALUE;
            for(int i = 0; i < data.length; i++)
            {
                if(data[i] > 0 && data[i] < minPosValue)
                {
                    minPosValue = data[i];
                    index = i;
                }
            }
            exceptIndex = index;
            return multipleExcept(data, index);
        }
    }
    public static int getIndex(int data[], int value)
    {
        for(int i = 0; i < data.length; i++)
        {
            if(data[i] == value)
            {
                return i;
            }
        }
        return -1;
    }
    public static long multipleExcept(int data[], int index)
    {
        long ret = 1;
       
        for(int i = 0; i < data.length; i++)
        {
            if(i != index)
            {
                ret *= data[i];
            }
        }
        return ret;
    }
   
    private static void formatOutputRet(long ret, int data[])
    {
        System.out.print("Result: " + ret);
        System.out.print(", Except Index = " + exceptIndex + ", " + data[exceptIndex]);
        System.out.println();
       
    }
    public static void test1()
    {
//        int data[] = {20, 2, 0, -7, -7, 6, 7, 0, 9, 10};
        int data[] = ArrayUtil.generate(10, 101);
        ArrayUtil.output(data);
       
        long ret = regMethod(data);
        formatOutputRet(ret, data);
       
        long ret1 = dp(data);
        formatOutputRet(ret1, data);
       
        long ret2 = analyse(data);
        formatOutputRet(ret2, data);
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        test1();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值