每日一题,周总结

·  阅读 38
每日一题,周总结

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

周一,我不知道的小知识!

//第一组
//1
String str1 = "hello";
str1 += ",world";
//2
StringBuilder sb1 = new StringBuilder("hello");
sb1.append(",world");

//第二组
//1
String str2 = "hello";
for (int i = 0; i < 3; i++) {
    str2 += ",world";
}
//2
StringBuilder sb2 = new StringBuilder("hello");
for (int i = 0; i < 3; i++) {
    sb2.append(",world");
}
复制代码

问: 第一组的1和2的效率谁快谁慢。那第二组呢?
答:
第一组一样,1编译后编译器会优化成2一样; 第二组2快,1编译后每次循环都会创建一个StringBuilder对象然后toString一次。

周二,我竟然栽在继承上了。。

public class Test {
    
  static class Base{}

  static class Agg extends Base {
    public String getFields() {
        String name = "Agg";
        return name;
    }
  }

  public static void main(String[] args) {
    Base b = new Agg();
    System.out.println(b.getFields());
  }
}
复制代码

问: 上面程序有问题吗?有的话请写出正确写法,得到输出结果是“Agg”
答:
其实Base类没有那个方法,所以无法调用,编译报错 但是我想输出“Agg”我们可以把父类强转成子类,所以结果是:

System.out.println(((Agg)b).getFields());
复制代码

周三,万恶的2,你能怎么这么。。。

public static void main(String[] args) {
    //判断一个数是偶数 输出是true
    System.out.println(test1(2));

    //判断一个正整数是2的整数次幂 输出是false
    System.out.println(test2(18));
}
//判断一个数是偶数
private static Boolean test1(Integer num) {
    //TODO
}

//判断一个正整数是2的整数次幂
private static Boolean test2(Integer num) {
    //TODO
}
复制代码

问: 请用各用一段代码补全上面两个程序,使其具有相应的功能。
答:

  1. return (num & 1) == 0;
  2. return (num & num - 1) == 0;

第二个的解释吧,有点多,给你一篇我的文章 https://mp.weixin.qq.com/s/7SSqiWt9bSnqZW8EgIB6nA

周四,求一个无序数组里有99个不重复的正整数,

//求一个无序数组里有99个不重复的正整数,
//1-100少了一个数,找出那个少的数。
public static void main(String[] args) {
  List<Integer> list = geList();
  list.remove(0);
  //TODO,求出我移除的数字是多少

}

//用于生成 一个1-100 少一个数又不连续的list
private static List<Integer> geList() {
  int[] z = IntStream
          .iterate(1, i -> i + 1)
          .limit(100).toArray();
  int a,b;
  Random r = new Random();
  //随机交换values.length次
  for(int i = 0;i < values.length;i++){
  //随机产生一个位置
    a = Math.abs(r.nextInt()) % (z.length-1);
    //随机产生另一个位置
    b = Math.abs(r.nextInt()) % (z.length-1); 
    //交换位置
    if(a != b){
        z[a] = z[a] ^ z[b];
        z[b] = z[a] ^ z[b];
        z[a] = z[a] ^ z[b];
    }
  }
  List<Integer> collect = Arrays
          .stream(z).boxed()
          .collect(Collectors.toList());
  return collect;
}
复制代码

问: 补全程序,其实就是一个无序数组有99个不重复的正整数,1-100少了一个,求少的哪个?
答:
求和相减

System.out.println((1 + 100) * 50 - list.stream().mapToInt(Integer::intValue).sum());
复制代码

周五,最简单的一道题?

public static void main(String[] args) {
    List<String> strList = 
    Arrays.asList("小", "编", "是");
    //TODO 补全代码
    //希望得到的输出结果是
    //[小, 编, 是, 笨, 蛋]
    System.out.println(strList);
}
复制代码

问: **不要给我留面子,请让它输出 “[小, 编, 是, 笨, 蛋]”
答:
其实这个就是考察Arrays.asList转成list后续不能调用list的方法因为, 看他是个list其实底层还是个数组, 所以一般都会这么写List<String> strList = new ArrayList<>Arrays.asList("小", "编", "是")); 《代表尖括号,微信转译有问题,不论怎么样都无法写成尖括号其实这个就是考察Arrays.asList转成list后续不能调用list的方法因为, 看他是个list其实底层还是个数组, 所以一般都会这么写List<String> strList = new ArrayList<>Arrays.asList("小", "编", "是"));

周六,周六休息一下,来道脑力题

三个人合资买一件东西,这个产品原价是30元,
现在三个人每人出10元,到了商店,老板说今天
做活动,该产品只要25元,说完就给商店的营业
员5元钱,叫她还给三个客人,可是营业员偷藏
2元,将3元钱还给三位客人,现问三位客人每
人出了10元-退还的1元=9元.
3*9=27+营业员偷2元=29,
第一次三个人每人出了10(3*10=30),
现在这边只有29元,那还有一元钱是哪个人拿了?
复制代码

问: 我的一块钱呢?
答:
回答者:一捧火山灰
三个客人每人出了10元,共30元,这30元包括:
①产品价格25元 ②营业员偷拿的2元 ③营业员返还的3元。
①+②+③=30元。
在营业员返还那3元后,③回到三人手里,三人付出的钱为①+②。
而上文中计算总钱数时却说"39=27+营业员偷2元"
相当于是①+②+②,并非总钱数。
因为营业员偷拿的钱是三人付出的钱的一部分,因此这里相加是不对的。
若要计算总钱数应为:三人付出的钱3
9+老板返还的3元=30元。

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改