剑指Offer第五十一题:构建乘积数组

构建乘积数组

https://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46?tpId=13&tqId=11204&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...A[i-1]*A[i+1]...*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)

思路:这题主要是如何减少复杂程度;本来B[i]=B[i-1]A[i]/A[i-1],但是不能用除法,那么可以考虑分割开来算,先算前一半A[1]*A[2]...A[i-1],再算后一半A[i+1]..*A[n-1],然后相乘即为最后答案.前一段的规律就是后一个数等于前一个数乘上A[i-1],后一段相似,把它反过来可以避免除法;
public class Q_51 {

public int[] multiply(int[] A) {
    int[] first = new int[A.length];
    int[] back = new int[A.length];
    first[0] = back[0] = 1;
    for (int i = 1; i < A.length; i++) {
        first[i] = first[i - 1] * A[i - 1];
        back[i] = back[i - 1] * A[A.length - i];
    }
    int[] B = new int[A.length];
    for (int j = 0; j < A.length; j++) {
        B[j] = first[j] * back[A.length - j - 1];
    }
    return B;
}
public static void main(String[] args) {
    int[] A = {1, 2, 3, 4};
    System.out.println(Arrays.toString(new Q_51().multiply(A)));
}

}

全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-04 02:00
offer1:字节跳动(北京)-&nbsp;后端开发岗-&nbsp;薪资:总包42w(基本工资30w+绩效6w+年终奖6w),15薪,加班费按法定标准发放-&nbsp;福利:公积金按12%缴纳,无宿舍,每月住房补贴2000元,餐补1500元,每年2次体检,免费健身房-&nbsp;工作强度:996是常态,忙的时候可能到凌晨,团队节奏快,压力大-&nbsp;其他:平台大,技术氛围浓,晋升路径清晰,对转行选手来说履历加分多,但北京生活成本高,租房压力大offer2:美团(上海)-&nbsp;客户端开发岗-&nbsp;薪资:总包38w(基本工资26w+绩效5w+年终奖7w),14薪,加班无加班费,可调休-&nbsp;福利:公积金按10%缴纳,无宿舍,每月住房补贴1800元,餐补800元,每年1次体检,节日福利丰富-&nbsp;工作强度:995为主,偶尔周末加班,项目紧急时会通宵,整体压力中等-&nbsp;其他:公司业务成熟,行业地位稳固,客户端岗位需求稳定,上海生活节奏比北京稍缓,但租房成本仍较高offer3:网易(杭州)-&nbsp;测试开发岗-&nbsp;薪资:总包32w(基本工资22w+绩效4w+年终奖6w),13薪,加班较少,无加班费-&nbsp;福利:公积金按12%缴纳,提供员工宿舍(单人间,前两年免费,第三年按市场价5折),每月餐补1000元,每年1次体检+1次旅游补贴-&nbsp;工作强度:965为主,几乎无强制加班,团队氛围轻松,摸鱼文化盛行-&nbsp;其他:杭州生活成本低于北上,宿舍省房租,测试开发岗入门难度低,适合转行过渡,但技术成长速度可能不如开发岗,未来跳槽竞争力未知本人情况:传统工科转行,编程基础一般,想快速提升技术能力,同时也希望工作生活能平衡,未来不确定是否留在一线城市。有没有同款转行选手或互联网前辈给点建议呀?
森七菜:梦到什么说什么属于是
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务