java简单习题

作业1:已知二叉树的
    前序遍历:ABCDEFGHK
    中序遍历:BDCAEHGKF

    根据已有条件,画出这个二叉树,同时输出该二叉树的后序遍历

分析:

前序遍历顺序:根左右

中序遍历顺序:左根右

根据前序遍历读出根,再根据中序遍历读出左右孩子,再根据前序遍历读出左/右根,如此交替判断。

前序遍历:ABCDEFGHK      知A为树的根
中序遍历:BDCAEHGKF      知BDC为A的左孩子,EHGKF为A的右孩子

前序遍历:ABCDEFGHK      知B为左子树根,E为右子树根
中序遍历:BDCAEHGKF      知DC为B的右孩子,HGKF为E的右孩子

前序遍历:ABCDEFGHK       知C为左子树根,F为右子树根
中序遍历:BDCAEHGKF       知D为C的左孩子,左子树完毕。HGK为F的左孩子

前序遍历:ABCDEFGHK       知G为根
中序遍历:BDCAEHGKF       知H为G的左孩子,K为G的右孩子,右子树完毕。

    

作业2:课堂案例,面向对象编程

1).求正方形、矩形、三角形周长和面积。

package com.openlab.demo;

public class Demo02 {

	public static void main(String[] args) {
		Square s = new Square();
		s.side = 4;
		System.out.println("正方形的周长是:" + s.circumfer());
		System.out.println("正方形的面积是:" + s.area());
		
		Rectangle r = new Rectangle();
		r.length = 4;
		r.width = 5;
		System.out.println("矩形的周长是:" + r.circumfer());
		System.out.println("矩形的面积是:" + r.area());
		
		Triangle t = new Triangle();
		t.a = 3;
		t.b = 4;
		t.c = 5;
		System.out.println("三角形的周长是:" + t.circumfer());
		System.out.println("三角形的面积是:" + t.area());

	}

}

//正方形
class Square{
	double side;//边长
	public double circumfer() {//周长
		return 4 * side;
	}
	public double area() {//面积
		return Math.pow(side, 2);
	}
}

//矩形
class Rectangle{
	double length;//长
	double width;//宽
	public double circumfer() {//周长
		return 2 * (length + width);
	}
	public double area() {//面积
		return length * width;
	}
}

//三角形
class Triangle{
	double a;//第一条边
	double b;//第二条边
	double c;//第三条边
	public double circumfer() {//周长
		return a + b + c;
	}
	public double area() {//面积,用海伦公式,因为不知道是什么三角形
		double p = circumfer() / 2.0;//周长的一半
		return Math.pow(p * (p - a) * (p - b) * (p - c), 0.5);
	}
}

2)有只猫,有很多属性
    名字
    性别
    年龄
    花色
    主人


 主人类,也有很多属性
    姓名
    性别
    年龄
    地址
    有猫

package com.openlab.demo;

public class Demo03 {

	public static void main(String[] args) {
		Master m = new Master();
		m.name = "王勇";
		m.age = 13;
		m.address = "陕西";
		m.gender = "男";
		
		Cat c1 = new Cat();
		c1.name = "小花";
		c1.age = 3;
		c1.color = "花色";
		c1.gender = '公';
		c1.master = m;
		//System.out.println(c1.master.name);
		//System.out.println(c1.master.age);
		
		Cat c2 = new Cat();
		c2.name = "小黑";
		c2.age = 2;
		c2.color = "黑色";
		c2.gender = '母';
		c2.master = m;
		
		//从主人这个方向关联两只猫
		Cat[] cats = {c1, c2};
		m.cat = cats;
	}

}


class Cat{
	public String name;//名字
	public char gender;//性别,也可以是数字,boolean,String
	public byte age;//年龄,也可以用int
	public String color;//花色
	public Master master ;//有个主人对象,属性可以是对象
}

class Master{
	public String name;//名字
	public int age;//年龄
	public String gender;//性别
	public String address;
	public Cat[] cat;//主人有猫
	
}

作业3:
    给定一个数字,求该数字的二进制的1的个数

方法三,位运算方法:

1)num - 1:将一个数减1,就是将这个数的二进制的最右边的1变成0,(0-1不起作用,若有0会向前借位,让1-1,此时这个二进制位就会变成0)然后它后边的所有位置都变成1(借位)

2)num & (num - 1):这个操作会让最右边的1开始全变成0

如此循环,露1,去1,楼1,去1,累加1即可。0011 0100 - 1 = 0011 0011   

0011 0100 - 1 = 0011 0011   
0011 0100 & 0011 0011 = 0011 0000  // 计数一个1
0011 0000 - 1 = 0010 1111
0011 0000 & 0010 1111 = 0010 0000  // 计数两个1
0010 0000 - 1 = 0001 1111
0010 0000 & 0001 1111 = 0000 0000  // 计数三个1,程序停止
package com.openlab.day10;

//给定一个数字,求该数字的二进制的1的个数
public class Work01 {

	public static void main(String[] args) {
		int num = 456;
		System.out.println(digit1(num));
		System.out.println(digit2(num));
	}
	
	//方法一:常规方法,转成二进制数,记录1的个数
	public static int digit1(int num) {
		int count = 0;//记录1的个数
		while(num != 0) {
			if(num % 2 == 1) {
				count++;
			}
			num = num >> 1;//相当于 num = num / 2
		}
		return count;
	}
	
		
		//方法二:位运算,与运算
		public static int digit2(int num) {
			int count = 0;//记录1的个数
			while(num != 0) {
				count++;
				num = num & (num - 1);
			}
			return count;
		}
}

作业4:    给定一个数组,该数组中除了一个元素只出现了一次,其他元素都出现两次
    找到这个没有重复的元素

package com.openlab.day10;

public class Work02 {

	public static void main(String[] args) {
		int[] arr = {5, 8, 9, 6, 7, 1, 8, 9, 6, 7, 5, 1, 2};
		System.out.println("这个没有重复的数为:" + findNoRepeat(arr));
	}
	//0 ^ 一个数 = 一个数    相同的数异或为0
	//重复两次的数异或都为0,剩下一个不重复的数,次数和0做异或,结果还等于这个数
	public static int findNoRepeat(int[] arr) {
		int result = 0;
		for(int i = 0; i < arr.length; i++) {
			result = result ^ arr[i] ;
		}
		return result;
	}
}


作业5:
    给定一个数组,数组的元素共N+1个, 元素是从1到n的联系自然数,其中一个重复值
    找到这个重复的元素

package com.openlab.day10;

public class Work03 {

	public static void main(String[] args) {
		int[] arr = new int[] {2, 4, 5, 1, 7, 9, 5, 6, 3, 8};//1到9,共10
		System.out.println("重复的元素是:" + findRepeat(arr));
	}
	
	//一个数 ^ 一个数 = 0   数是从1到n,刚好可以利用下标进行异或,
	//留下的那个数就是不重复的
	//0异或一个数是0,不影响最后的结果,下标是从0开始的,所以i = 0
	public static int findRepeat(int[] arr) {
		int result = 0;
		for(int i = 0; i < arr.length; i++) {
			result = i ^ arr[i];
		}
		return result;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值