牛客杂记——(神奇的口袋 、用两个栈实现队列)

基础知识

1、在JAVA中,假设A有构造方法A(int a) ,则在类A的其他构造方法中调用该构造方法和语句格式应该为this(X)。
2、装箱、拆箱操作发生在引用类型和值类型之间
基本数据类型转化成包装类是装箱 (如: int --> Integer)。
包装类转化成基本数据类型就是拆箱 (如:Integer --> int)。
包装类就是引用类型,基本数据类型就是值类型
装箱——值类型转换为引用类型;拆箱——引用类型转换为值类型。
3、SimpleDateFormat是线程不安全的
4、ConcurrentHashMap不是使用synchronized关键字保证线程安全

在这里插入图片描述 5、HashMap实现了map接口
6、Array.asList方法返回对象是一个Arrays内部类,并没有实现集合的修改方法。 Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
7、关于泛型
1)虚拟机中没有泛型。只有普通类和普通方法
2)所有泛型类的类型参数在编译时都会被擦除
3)创建泛型对象时请指明类型,让编译器尽早的做参数检查
4)泛型的类型擦除机制能在运行时动态获取List中T的实际类型

编程

神奇的口袋

[编程题]23630-神奇的口袋
链接:https://www.nowcoder.com/questionTerminal/9aaea0b82623466a8b29a9f1a00b5d35
[神奇的口袋]有一个神奇的口袋,总的容积是40 ,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积
分别是a1 , 2… John可以从这些物品中选择-一些 ,如果选出的物体的总体积是40 ,那么利用这个神奇的口袋, John就可以得到这些物品。现在的问题
是,John有多少种不同的选择物品的方式。

在这里插入图片描述
【解题思路】:
采用递归思想:
①物品n个,物品体积逐一放入weight[]中
②递归函数count(int s,int n) : 其中s为剩余物品重量,n为剩余可选的物品个数
则分以下两步递归求解:
a.从后往前装,装上weight[n]后,若剩余物品仍然有解
则count(s-weight[n],n-1);
b.若装了weight[n]后,无解,则删除该包,尝试第n-1个
count(s,n-1);

import java.util.*;
public class Main {
    static int[] weight;
    static int N;
    static int count=0;
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while (input.hasNext()) {
            N = input.nextInt();
            weight = new int[N+1];
            for (int i = 1; i <= N; i++) {
                weight[i] = input.nextInt();
            }
            count(40,N);
            System.out.println(count);
        }
    }
    public static void count(int s,int n) {
    //如果正好装满
     if(s==0) {
        ++count;
        return ;
    }
      //是s<0或n<1则不能完成
        if(s<0||(s>0&&n<1))
            return ;
    count(s-weight[n],n-1);
    count(s,n-1);
}
}

用两个栈实现队列

[编程题]23281-用两个栈实现队列
链接https://www.nowcoder.com/questionTerminal/54275ddae22f475981afa2244dd448c6
在这里插入图片描述
【解题思路】:
栈1用来作入队列
栈2用来出队列,当栈2为空时,栈1全部出栈到栈2,栈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) {
        stack1.push(node);

    }
    public int pop() {
        while (!stack1.empty()){
            stack2.push(stack1.pop());
        }
        int temp = stack2.pop();
        while(!stack2.isEmpty()){
            stack1.push(stack2.pop());
        }
        return temp;
    }
}

猜你喜欢

转载自blog.csdn.net/char_m/article/details/106764360