目录标题

  • 题目一
  • 题目二
  • 题目三
  • 题目四
  • 题目五


题目一

题干: 给定一个数组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相与左移一位求得是进位的值,什么时候进位的值为零(可理解为不进位了),我们异或求的就是最终结果

java 对象修改细节数据表设计_leetcode

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;
    }
}