2021-2-28某Web后台笔试总结,一张图搞定String和==的的面试题

cvte的Web后台实习岗笔试,总结一下我印象比较深刻的题目,凭记忆回顾。虽然以前学过Java SE,还做过笔记,但是平时不用的很细的知识,一考到就真的忘的一干二净。

每一次从不会到会的总结,都是一次进步!继续加油!!!

题1:String和==

题目我忘了,直接上总结

// 变量全部存在栈中;变量存的是一块内存的引用;new所开辟的内存在堆中

// 先在常量池查找是否已存在常量"JavaWeb",如果已经存在,则s指向该内存
// 如果不存在,则在常量池开辟一块空间,并将s指向该内存
String s = "JavaWeb";
// 直接在堆中开辟一块空间
String s2 = new String("JavaWeb");
// 直接在堆中开辟另一块空间
String s3 = new String("JavaWeb");
// 返回s2在常量池中的常量的引用
String s4 = s2.intern();
// 返回s5在常量池中的常量的引用
String s5 = s3.intern();

// 两个常量拼接成新的常量"JavaWeb",由于该常量在常量池中已存在
// 所以直接将s6指向该常量
String s6 = "Java" + "Web";

String s7 = "Java";
// 相当于调用:s7.concat("Web")
// s8指向的是拼接之后新的String对象在堆中地址
String s8 = s7 + "Web";
// 相当于调用:s7.concat(s3)
// s9指向的是拼接之后新的String对象在堆中地址
String s9 = s2 + s3;

System.out.println(s == s2); // false
System.out.println(s2 == s3); // false
System.out.println(s == s4); // true
System.out.println(s == s5); // true
System.out.println(s == s6); // true
System.out.println(s == s8); // false
System.out.println(s == s9); // false

 题2:泛型

// 变量
List<Integer> nums= new ArrayList<>();


// 方法声明
void test(List<Number> list); 
// 调用
test(nums); // 编译报错。List<Number>和List<Integer>并不体现父子关系,所以无法体现多态


void test(List<? extend Number> list);
test(nums); // 正确。相当于 ? <= Number(?是Number子类),将Integer代入?


void test(List<? supe rNumber> list);
test(nums); // 编译报错。相当于 ? >= Number(?是Number父类),将Integer代入?。显然不正确

题3:走楼梯

小明走楼梯,一步可以跨1阶、2阶或3阶。请问小明走到第n阶有多少种走法?

例:到第3阶,共有8种走法。到第8阶,共有81种走法。

PS:题目大意是这样,题目描述我编的

简单的动态规划,关键是分析出递推式。对于打比赛的算法大佬来说,估计一眼就看出来了。

要想得出递推式,我们可以这么想:最后一步怎么走的?换言之就是,最后经历了怎样的一步,到达了第n阶?再换言之,最后一步是从第几阶走到第n阶?

最后一步的走法,有以下3种情况:

1、最后一步是从第n-1阶到第n阶。最后一步的只有1种走法,就是跨1阶。假设已经知道到第n-1阶的走法共有 a[n-1] 种,则根据乘法原理该情况下,到第n阶的走法共有 a[n-1] × 1 种

2、最后一步是从第n-2阶到第n阶。最后一步的走法有2种,①连续跨2个1阶;②直接跨1个2阶。其中情况①显然已经被包含在了第1种情况中了。所以该情况下,最后一步的有效走法,只有1种。所以,到第n阶的走法共有 a[n-2] 种

3、最后一步是从第n-3阶到第n阶。最后一步的走法有4种,①连续跨3个1阶;②先跨1阶,再跨2阶;③先跨2阶,再跨1阶;④直接跨3阶。其中,显然情况①③被包含在了第1钟情况中,情况2被包含在了第2种情况中。所以该情况下,最后一步的有效走法,只有1种。所以,到第n阶的走法共有 a[n-3] 种

所以可以得出递推式,到第n阶的走法的种数:a[n] = a[n-1] + a[n-2] + a[n-3],n > 3

其中,显然,a[1] = 1,a[2] = 2, a[3] = 4。

    public int takeStairs(int n) {
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        if (n == 3) {
            return 4;
        }

        // 前3个
        int a = 1, b = 2, c = 4;
        int ans = 0;
        for (int i = 4; i <= n; i++) {
            ans = a + b + c;
            a = b;
            b = c;
            c = ans;
        }
        return ans;
    }

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值