Java教程

力扣算法成长日记 ———— 01

本文主要是介绍力扣算法成长日记 ———— 01,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

力扣算法成长日记 ———— 01

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值target 的那 两个 整数,并返回它们的数组下标

public class SumOne {

    //第一种方式
    public int[] plusOne(int[] digits){
        for (int i = digits.length-1; i >=0; i--) {
            if(digits[i]>=0 && digits[i]<10 && digits[i] != 9){
                digits[i]++;
                return digits;
            }
            digits[i]=0;
        }
        //跳出for循环,说明数字全部是9
        int[] temp=new int[digits.length+1];
        temp[0] = 1;
        return temp;
    }

    //第二种方式:模拟加法
    public int[] plusOne1(int[] digits){
        //存储进位
        int carry = 1;
        //从后往前开始遍历
        for (int i = digits.length-1; i>= 0; i--) {
            int v = digits[i] + carry;
            //判断是否需要进位
            if(v == 10){
                digits[i] = 0;
                carry = 1;
            } else {
                digits[i] = v;
                carry = 0;
                //本题固定加1,再往前计算不会有进位了,所以这里可以break出去了
                break;
            }
        }

        if(carry == 0){
            return digits;
        }

        //说明数组中全是9,处理最高位进1的情况
        int[] temp = new int[digits.length+1];
        temp[0] = 1;
        return temp;
    }
}

两个栈实现一个队列

public class TwoStackToQueue<E> {

    private Stack<E> stack1=new Stack<>();
    private Stack<E> stack2=new Stack<>();

    //入队
    public void offer(E value){
        stack1.push(value);
    }

    //出队
    /**
     * 思路:1.入队列的时候只往stack1添加元素就行
     * 2.出队列的时候先判断stack2是否为空,stack2中的元素都是先进来的,先进先出
     * 如果stack2不为空,则直接弹出stack2的栈顶元素。如果为空,则将stack1的元素添加到stack2中,然后弹出stack2的栈顶元素
     */
    public E poll(){
        //先进行判断,如果两个栈都为空,那么代表队列中没有元素
        if(stack1.isEmpty() && stack2.isEmpty()){
            return null;
        }

        if(stack2.isEmpty()){
            while (!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }

        E value = stack2.pop();
        return value;
    }

    //判断队列是否为空
    public boolean empty(){
        //只有两个栈同时为空的时候队列才为空
        if(stack1.isEmpty() && stack2.isEmpty()){
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        TwoStackToQueue twoStackToQueue=new TwoStackToQueue();
        for (int i = 0; i < 6; i++) {
            int data =(int) (Math.random()*100+1);
            System.out.print(data+"  ");
            twoStackToQueue.offer(data);
        }

        System.out.println();

        System.out.println("出队");
        while (!twoStackToQueue.empty()){
            System.out.print(twoStackToQueue.poll()+"  ");
        }
    }
}

两个队列实现一个栈

/**
 * @author wcc
 * @date 2021/10/21 10:34
 * 两个队列实现一个栈
 * 1.定义两个队列queue1和queue2
 * 2.出栈的时候先判断queue1是否为空,因为queue1中的元素总是后进来的,后进先出,除了队列的最后一个元素
 * 将其他元素添加到queue2,queue1的最后一个元素出队
 * 3.出栈的时候如果再2中判断queue1为空,除了queue2的最后一个元素,将queue2中其他元素添加到queue1
 * 然后queue2中的最后一个元素出队
 */
public class TwoQueueToStack<E> {

    private Queue<E> queue1 = new LinkedList<>();
    private Queue<E> queue2 = new LinkedList<>();

    //入栈
    public void push(E e){
        queue1.add(e);
    }

    //出栈
    public E pop(){
        if(queue1.isEmpty() && queue2.isEmpty()){
            return null;
        }
        //先判断queue1是否为空
        if(!queue1.isEmpty()){ //如果不为空
            //将queue1队列中的元素放入queue2中,queue1中只留下一个元素
            for (int i = 0; i < size()-1; i++) {
                queue2.add(queue1.poll());
            }
            //之后再将queue2中的数据再次放回queue队列中
            for (int i = 0; i < size()-1; i++) {
                queue1.add(queue2.poll());
            }
            return queue1.poll();
        }
        return null;
    }

    public int size(){
        return queue1.size()+queue2.size();
    }

    public boolean empty(){
        if(queue1.size()==0){
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        TwoQueueToStack<Object> objectTwoQueueToStack = new TwoQueueToStack<>();
        for (int i = 0; i < 6; i++) {
            int data =(int) (Math.random()*100+1);
            System.out.print(data+"  ");
            objectTwoQueueToStack.push(data);
        }

        System.out.println();

        System.out.println("出栈");

        while (!objectTwoQueueToStack.empty()){
            System.out.print(objectTwoQueueToStack.pop()+"  ");
        }
    }
}
这篇关于力扣算法成长日记 ———— 01的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!