目录标题
- 题目一
- 题目二
- 题目三
- 题目四
- 题目五
题目一
题干: 给定一个数组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[0] 中没有A[0],B[1]中没有A[1],B[n-1]中没有A[n-1]
思路 :我们可以在计算B[0]的时候使 A[0]为1,并且在计算完成后需要将A[0]变为原来的值
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
//创建B数组
int[] B = new int[A.length];
boolean changed = false;
for(int i = 0;i < B.length;i++){
//初始值为1
B[i] = 1;
for(int j = 0;j < A.length;j++){
//需要有一个temp来保存A值
int temp = 1;
if(j == i){
temp = A[j];
A[j] = 1;
changed = true;
}
B[i] *= A[j];
if(changed){
A[j] = temp;
changed = false;
}
}
}
return B;
}
}
题目二
题干: 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路: 比如我们求5和7的值,^异或运算符:相加不进位,(5&7)<<1相与左移一位求得是进位的值,什么时候进位的值为零(可理解为不进位了),我们异或求的就是最终结果
public class Solution {
public int Add(int num1,int num2) {
while(){
//求和不进位的结果
sum = num1 ^ num2;
//进位的值
num2 = (num1 & num2) << 1;
num1 = sum;
}
return num1;
}
}
题目三
题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:
当有1个台阶的时候 有1中跳法 2的0次幂
当有2个台阶的时候 有2中跳法 2的1次幂
当有3个台阶的时候 有4中跳法 2的2次幂
当有4个台阶的时候 有8中跳法 2的3次幂
…
当有n个台阶的时候 有8中跳法 2的n-1次幂
public class Solution {
public int JumpFloorII(int target) {
if(target <= 0)
return 0;
//<<左移预算符相当于*2
return 1 << (target-1);
}
}
题目四
题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路: 列队为先进先出,栈为先进后出,用两个栈实现先进先出的原则,那么我们只需要将其中一种栈用于实现进入队列,另一个栈用于实现出队列即可。此处我们将栈2实现出队列的功能
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
//判断栈2是否为空,不为空的时候,需要先让栈2中的元素进入栈1
//因为先进入的元素一定要位于栈1的下方才能保证在出队列的时候
//进入栈2能位于栈1的上方,保证先出队列,实现先进先出的原则
while(!stack2.isEmpty()){
stack1.push(stack2.pop());
}
stack1.push(node);
}
public int pop() {
while (!stack1.isEmpty()){
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
题目五
题干: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2
思路: 1.我们可以先对数组进行排列,然后用循环将相邻的两个值判断即可
import java.util.*;
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers == null || length == 0){
return false;
}
Arrays.sort(numbers);
for(int i=0;i<length-1;i++){
if(numbers[i] == numbers[i+1]){
duplication[0] = numbers[i];
return true;
}
}
return false;
}
}
思路: 2.我们可以采用HashSet中contain方法,先创建一个HashSet,对数组中的值进行contain判断,返回真则有重复的数值
import java.util.*;
public class Solution {
public boolean duplicate(int nums[],int length,int [] duplication) {
if(nums == null || length == 0){
return false;
}
for(int i=0;i<length;i++){
while(nums[i] != i){
if(nums[i] == nums[nums[i]]){
duplication[0] = nums[i];
return true;
}
// swap
int tmp = nums[i];
nums[i] = nums[tmp];
nums[tmp] = tmp;
}
}
return false;
}
}