动机

今天刷Leetcode时碰到的一道问题(216. Combination Sum III):

Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.

给出的function signature为:

public List> combinationSum3(int k, int n) {

}

注意此处返回type为List of List

一开始我傻傻中招(Java知识太不扎实),直接用

List> ls = new List>();

来创建ls,结果报错:List是interface

这个问题我已多次犯过,每次都不长记性,归根结底是自己基础知识不扎实造成的重复性错误。因此我把本文当作知识点记录,来加深对Java List interface及其引申类的理解。

1. 如何实例化(instantiate)List?

当一个class A implements(实现)了一个interface B,那么A和B就有了is-a的关系,及我们可以用:此处A应为concrete class

B obj = new A();

来实现B的实例化。

注意:A obj = new B()是错误的

那么有哪些classes implement了Java List interface呢?参考Oracle提供的documentation,其中比较常用的有:

ArrayList 和 LinkedList

所以实例化时我们可以用:

List ls1 = new ArrayList();

List ls2 = new LinkedList();

注意,ls只可以调用List所有的函数,而不可以调用ArrayList或LinkedList中的(List interface没有定义)的函数。下面的函数调用会引起compiler error:

ls2.addFirst(e);

如果我们想要调用concrete class A中另外的函数,我们需要类型为A的引用。ArrayList和LinkedList都提供了方便的转换方法:

ArrayList arrayLs = new ArrayList(ls1);

LinkedList linkedLs = new LinkedList(ls2);

若我们想要完成ls2.addFirst(e),我们可以使用:

linkedLs.addFirst(e);

ls2 = linkedLs;

来达到同样的效果。

2. 如何实例化List of List

在完成了以上的搜索后,再来看如何实例化List>,这里我犯了第二个错误:

List> ls = new ArrayList>();

这是错误的,引起compiler error:cannot convert ArrayList> to List>

为什么不能用B obj = new A()呢?这里和generic type有关,此处有比较详细的解释。总体来说,A和B不是is-a的关系。

如下才是正确的方法:

List> ls = new ArrayList>();

在这里,List可以出现在右侧,因为它是以数据类型的形式出现,而不是以Constructor的形式出现。

当我们需要进一步在ls中添加List时,只需要根据1中的例子,来实例化List即可

3. 实现List的类之间的比较(ArrayList, LinkedList, Stack, Vector)

//TODO

最后分享一下本题我的答案:

public class Solution {

public List> combinationSum3(int k, int n) {

List> rtLs = new LinkedList<>();

if(k <=0 || (n / k) < lvl) return rtLs;

if(k == 1 && n >= lvl && n <= 9) {

LinkedList ls = new LinkedList();

ls.add(n);

rtLs.add(ls);

return rtLs;

}

for(int i = lvl; i < 10; i++) {

if(i > n) break;

lvl = i+1;

List> shorterLs = combinationSum3(k-1, n-i);

for(List ls : shorterLs) {

LinkedList als = new LinkedList(ls);

als.addFirst(i);

rtLs.add(als);

}

}

lvl = 1;

return rtLs;

}

private static int lvl = 1;

}

本题容易产生歧义的地方是a unique set of numbers,其中unique比较容易理解,即不可有顺序不同数字相同的重复解,而set这个条件比较容易被忽略,应理解为每个解中的数字只可出现一次,如[3,3,3]就不是n=3, k=9的解

java instantiation,Instantiation of List (Java)相关推荐

  1. 广东java工资一般多少_广东java工资待遇,广东java工资一般多少,广东java工资底薪最低多少...

    广东java工资待遇,广东java工资一般多少,广东java工资底薪最低多少 首页 > java > 广东java工资待遇 作者:镀金池   发布时间:2018-12-22 11:20 在 ...

  2. inside java security_Inside The JVM Part2: java如何实现安全性

    网络移动性和平台无关性略过...看看java如何实现安全性 Java通过提供一个"安全沙箱"来保证从网络或者其他不信任的地方下载并运行的程序不会破坏本地数据,为了确保沙箱是可靠的, ...

  3. java ee 6 sdk中文版,Java EE 6 SDK+Eclipse JEE+Android ADT-Fun言

    很多时候,为了生存,需要不断的了解,学习新东西,于是头脑塞满了便便- -|||- -----------------------.. 按照自己的理解: JDK = Java Develope Kit ...

  4. java 生成pdf itext_使用Java组件itext 生成pdf介绍

    iText是一个能够快速产生PDF文件的Java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好的给合.使用iText与 ...

  5. java初始化数据报_初始化java原因

    虚拟机的类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类 即虚拟机的类加载机制. 在Java中,类型的加载.链接 ...

  6. java中的action_浅析java中action的作用

    正如早先指出的那样,action()并不是我们对所有事进行分类后自动为handleEvent()调用的唯一方法.有三个其它的被调用的方法集,如果我们想捕捉某些类型的事件(键盘.鼠标和焦点事件),因此我 ...

  7. java写exe程序实例,java实现可安装的exe程序实例详解

    java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...

  8. java基础入门传智播客 源码_Java-_2020年版Java零基础视频教程(Java 0基础,Java初学入门)魔鬼讲师老杜出品...

    不会闲聊!!!不会扯淡!!!小UP只会分享与Java相关的学习资源 还记得那年带你Java入门的一声"吼"吗? B站目前播放量已经快到450多万播放量的Java零基础教程的创作者& ...

  9. Java项目:车租赁管理系统(java+Gui+文档)

    源码获取:博客首页 "资源" 里下载! 功能介绍: 登陆界面.管理员界面.用户界面.汽车租赁文档 系统主页: @SuppressWarnings("serial" ...

  10. 编写运行最简单的java程序——使用记事本编写java程序

    编写运行最简单的java程序--使用记事本编写java程序 第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还 ...

最新文章

  1. IBM首席执行官提出人工智能部署三大基本原则
  2. Oracle表分区详细说明
  3. Python 列表元组字典集合
  4. tiny4412--linux驱动学习(2)
  5. EE JSP:Servlet的反向外套
  6. kali安装docker(有效详细的教程)
  7. 辗转相除法--最大公约数/最大公倍数
  8. AngularJS 使用 Promise
  9. (转)ArcObjects SDK(AE)10.1在vs2012安装的方法
  10. 单片机C语言PWM程序原理,单片机C语言程序设计:用 ADC0808 控制 PWM 输出
  11. bzoj1079 [SCOI2008]着色方案
  12. 字典 选取前100_100道 Python 经典练习题004
  13. netbeans写登录界面java_NetBeans 界面美化与字体设置
  14. 特洛伊木马 (计算机木马程序)
  15. 卷积bp神经网络算法详解,卷积神经网络实例讲解
  16. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte xx in position xx: invalid continuation byte
  17. windows7 《寒江独钓》传统键盘过滤驱动学习
  18. html怎么设置默认图片,怎样设置默认照片浏览器
  19. 计算机系统维护与硬件检查,计算机硬件维护与检测方法
  20. SLCP认证辅导,SLCP认证产品应覆盖不同的产品类别

热门文章

  1. 【渝粤教育】广东开放大学 嵌入式数据库 形成性考核 (48)
  2. 【渝粤题库】陕西师范大学200481 高级英语(一)
  3. java wrap方法_Java WritableCellFormat.setWrap方法代码示例
  4. 应用程序添加到服务器,在同一应用程序中的配置服务器和eureka服务器:尝试连接到localhost:8761...
  5. linux 嵌入式串口通信设计目的,基于linux的嵌入式串口通信.doc
  6. 三星ml1660拆机图解_炫龙DD2拆机,高性能的背后是怎样的面容?
  7. MATLAB库函数polly2trellis(卷积码生成多项式转网格图描述)的实现过程详解
  8. [精品]CSAPP Bomb Lab 解题报告(五)
  9. jboss数据源配置
  10. 用Paint Tool SAI绘制漫画