这道题的具体思路请参看 何海涛的微博:http://weibo.com/zhedahht
import java.math.BigInteger;
import java.util.Arrays;
public class CreateBFromATencent {
/**
* 题目:输入一个数组A[1,2,...n],求输入B,使得数组B中的第i个数字B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[N-1].
* 要求
* 1.不得使用除法
* 2.不得新建变量--how?
* see http://weibo.com/zhedahht
*/
public static void main(String[] args) {
int[] a=new int[20];
for(int i=0;i<20;i++){
a[i]=i+1;
}
System.out.println(Arrays.toString(a));
BigInteger[] b1=create(a);//I don't like 'BigInteger',but program will overflow without using it.
System.out.println(Arrays.toString(b1));
BigInteger[] b2=createWithoutDivision(a);
System.out.println(Arrays.toString(b2));
}
//general solution.Use division
public static BigInteger[] create(int[] a){
if(a==null||a.length==0){
return new BigInteger[0];
}
int len=a.length;
BigInteger[] b=new BigInteger[len];
//BigInteger product=new BigInteger("1");
BigInteger product=BigInteger.valueOf(1);//<Effective Java>.Use "static factory method" instead of constructor sometimes.
BigInteger[] aa=new BigInteger[len];
for(int i=0;i<len;i++){
aa[i]=BigInteger.valueOf(a[i]);
product=product.multiply(aa[i]);
}
for(int i=0;i<len;i++){
b[i]=product.divide(aa[i]);
}
return b;
}
//not use division.
public static BigInteger[] createWithoutDivision(int[] a){
if(a==null||a.length==0){
return new BigInteger[0];
}
int len=a.length;
BigInteger[] b=new BigInteger[len];
BigInteger[] aa=new BigInteger[len];
b[0]=BigInteger.valueOf(1);
for(int i=0;i<len;i++){
aa[i]=BigInteger.valueOf(a[i]);
if(i+1<len){
b[i+1]=b[i].multiply(aa[i]);
}
}
BigInteger tmp=BigInteger.valueOf(1);
for(int i=len-2;i>=0;i--){
tmp=tmp.multiply(aa[i+1]);
b[i]=b[i].multiply(tmp);
}
return b;
}
}
分享到:
相关推荐
给定一个长度为`n`的数组`a[n]`,要求构造一个新的数组`b[n]`,使得对于每一个`i` (0 ≤ i < n),`b[i]`等于`a[0] * a[1] * … * a[n-1] / a[i]`,但题目明确规定不能使用除法操作。此外,还需满足以下条件: - 时间...
1.6.3. 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数 位于数组的后半部分 ...........................................................130 1.6.4. 给定链表的头指针和一个...
例如,对于数组`a[0...n-1]`,我们可以用两个指针,一个从头开始,一个从尾开始,同时向中间移动并交换它们指向的元素,直到两个指针相遇。这样就可以实现数组的反转。 以题目中的例子为例,假设数组为`abcdefgh`,...
tencentcloud-sdk-java-3.1.270
【腾讯2012实习生试题(技术运营)】是一份针对有意加入腾讯技术运营岗位的实习生的考核资料,反映了当时腾讯对于技术运营实习生的能力要求和期望。这份试题可能包括了多方面的问题,旨在考察候选人的技术理解、问题...
这份简历是一位对IT领域充满热情,特别是对Java和Python编程感兴趣的实习生的简历。他在自我评价中表达了对软件开发的热爱,强调了承受压力的能力、团队合作精神、自学能力和动手实践能力。他的专业是软件工程,具备...
腾讯云SDK
这个标题似乎是一个重复的字符串,其中“java”和“QQ”交替出现,可能暗示了我们正在处理一个与Java编程语言和QQ(可能是腾讯的即时通讯软件)相关的项目或者讨论。在Java编程中,QQ可能是指一个特定的应用程序接口...
### 腾讯2013实习生校园招聘笔试题解析 #### 一、表达式的运算结果及原因 题目要求分析四个表达式 `(A) a+=(a++); (B) a+=(++a); (C) (a++)+=a; (D) (++a)+=(a++);` 在 `int a = 4;` 的初始条件下,判断这些表达式...
2. **缩容**:当数组元素个数远低于数组容量时(例如元素个数/数组容量小于等于1/4时),数组容量减半。 这种策略可以有效减少数组的复制次数,从而降低平均时间复杂度。虽然某些情况下插入或删除操作仍可能触发一...
这个SDK使得Java开发者能够轻松地在自己的应用中调用腾讯的各项API,提升开发效率和应用功能。下面我们将深入探讨这个SDK的一些关键知识点。 1. **SDK简介** 腾讯SDK for Java是一套完整的开发工具包,包含了腾讯...
本资源为不定项数组的输入方法,利用数据结构vector实现,内有详细的C++代码,经常在算法竞赛或是通信/互联网公司(尤其是牛客网笔试题,如华为、腾讯、阿里)笔试题中用到,欢迎大家下载!
### 2013腾讯实习生笔试题解析 #### 1. 单项选择题解析 **题目1**:本题考查基本的算术运算规则及其性质。 - **选项A**: `a1` 和 `a2` 的计算结果是否相同取决于括号的影响。`a1 = x + y - z` 和 `a2 = x - z + y...
这是一个经典的算法问题,在腾讯实习生笔试中也是一个常见的考察点。该问题的目标是从一个整数数组中找出一个子数组,使得这个子数组的元素之和最大。解决这个问题的方法有多种,其中最著名的是Kadane算法,时间...
【腾讯2021实习生校园招聘后台笔试题解析】 1. 表达式判断与赋值操作: 在C++中,表达式(A)、(B)、(C)和(D)涉及到了自增运算符++的使用。自增运算符有两个版本:前缀++(a++)和后缀++(++a)。自增运算符会改变变量的...
编写一个函数`void reverseSentence(char *pStr, int iLen)`,该函数接收一个字符数组`pStr`作为输入,并将这个数组中的英文句子进行倒置。例如,若输入为"iamondutytoday",则输出应为"todaydutyonami"。 #### ...
【标题】: 腾讯应用宝商业数据产品助理实习生岗位相关资料 【内容】: 在互联网巨头腾讯的麾下,应用宝作为国内知名的移动应用分发平台,其商业数据产品助理实习生的角色扮演着至关重要的角色。这个职位不仅要求...
标题"8.(地图数据篇)腾讯地图矢量瓦片数据爬取--java代码.zip"指出,我们将探讨一个使用Java进行的腾讯地图矢量瓦片爬取项目。这通常涉及到网络请求、解析地图服务接口的JSON响应,以及可能的多线程技术来加速数据...
【腾讯2020年Java面试知识点】 在2020年的腾讯面试中,Java开发者需要具备扎实的技术基础和实际项目经验。以下是一些重点考察的知识点: 1. **项目挑战与解决思路**: 面试官可能会询问你在过往项目中遇到的重大...