每天学习算法,一点一点积累。
书中写到:数据结构+算法=程序,数据结构是程序的骨架,算法是程序的灵魂。
我觉得这一句话说的很对,程序有了灵魂才能更持久
算法题目描述
算法知识点如下
模拟计算器,类型:算法初阶,比较简单。
设计学生类和子类,类型:基础知识,比较简单。
二叉树开展为链表,类型:栈,树,中等难度。
第一题算模拟简单的计算器法题目描述
模拟简单的计算器。 要求:
(1)定义名为Number的类,在其中定义两个私有的整型数据成员n1和n2;
(2)在Number类中编写构造方法,赋予n1和n2初始值;
(3)再为Number类定义加(addition)、减(subtration)、乘(multiplication)、除(division)四个公有成员方法,分别对两个成员变量执行加、减、乘、除的运算。注意:除法运算时要抛出除数为0的异常。
(4)在主方法中创建Number类的对象,调用上述各个方法,测试并输出计算结果,注意进行必要的异常捕获与处理。
Java解答参考思路
public class Number {
private int n1;
private int n2;
public Number(int n1, int n2) {
this.n1 = n1;
this.n2 = n2;
}
public int addition() {
return n1 + n2;
}
public int subtration() {
return n1 - n2;
}
public int multiplication() {
return n1 * n2;
}
private int division() {
if (n2 == 0) {
throw new IllegalArgumentException("除数参数不合法");
}
return n1 / n2;
}
public static void main(String[] args) {
Number number = new Number(6, 0);
System.out.println(number.addition());
System.out.println(number.subtration());
System.out.println(number.multiplication());
try {
System.out.println(number.division());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
第二题设计一个学生类和子类题目描述
设计一个学生类Student和它的一个子类Undergraduate,要求如下:
(1)Student类有name和age属性,一个包含两个人参数的构造器,用于给两属性赋值,一个show()方法打印Student的属性信息。
(2)本科生类Undergraduate增加一个degree(学位)属性。有一个包含三参数的构造器,前两个参数用于给集成的属性赋值,第三个参数给degree专业见值,一个show()方法用于打印Undergraduate的属性信息。
(3)在测试类中分别打印Undergraduate和Student对象,调用它们的show()
Java解答代码
public class test {
public static void main(String[] args) {
Student stu = new Student("student", 100);
stu.show();
Undergraduate undergraduate = new Undergraduate("Undergraduate", 20, "本科");
undergraduate.show();
}
}
class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show() {
System.out.println("名字:" + this.name + "\t年龄:" + this.age);
}
}
class Undergraduate extends Student {
private String degree;
public Undergraduate(String name, int age, String degree) {
super(name, age);
this.degree = degree;
}
public void show() {
System.out.println("名字:" + super.getName() + "\t年龄:" + super.getAge() + "\t学位:" + this.degree);
}
}
第三题二叉树开为链表题目描述
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
什么是先序遍历呢?解释如下:
需要实现如下:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [0]
输出:[0]
提示:
树中结点数在范围 [0, 2000] 内
-100 <= Node.val <= 100
进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?
Java代码解题
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
class Solution {
public void flatten(TreeNode root) {
while (root != null) {
if (root.left == null)
root = root.right;
else {
TreeNode pre = root.left;
while (pre.right != null)
pre = pre.right;
pre.right = root.right;
root.right = root.left;
root.left = null;
root = root.right;
}
}
}
}