堆、栈复习、常见错误和循环与数组题目

复习

  1. 内存中的数组

    堆:
    	所有使用new创建出来的对象都放在堆内存中
    栈(方法栈):
    	方法是被放在栈内存中执行。在方法中定义的变量也是在栈内存中的。
    	
    堆与栈如何联系起来?
    	int[] arr = new int[10];
    	arr : 栈  数组在堆内存中的首地址值   
    	new int[10] : 堆
    	arr[3] = 100;  arr保存的是首地址值 + 3 * 所占的空间 4个字节 
    	为什么数组的索引是从0开始的?
    	为了方便计算地址。如果从1开始,则在计算时还需要再进行减1操作。因为arr里边存的是首地址值。
    	
    	int byte short long - 0
        char - '\u0000'  
        char[] ch = new char[10];
        - eclipse - 空格
        - idea - 啥也没有
        
        int num = ch[0];// num - 0
        
        char ch1 = ' ';
        int num1 = ch1;// 32
    	
    

    2.数组中碰到的两个异常

    ArrayIndexOutOfBoundsException - 数组索引越界异常
    	当使用负索引或大于等于数组长度索引时,会报错
    	
    NullPointerException - 空指针异常
    	当没有为数组对象进行初始化,赋值为了null。而又使用数组时报错。
    

    题目

    1.编写程序,给定一个整数,按相反顺序输出该数。例如,754321, 控制台输出为7654321。
    	int num = 1234567;
    	// 程序执行后,在控制台打印出7654321
    	// 运算符+循环+分支
    	// 根据1234567对10取余 可以拿 7
    	// 根据1234567除以10   可以拿123456
    	// 直到此num为0结束
    	
    2.打印出100-999之间所有的水仙花数, 例如:153是一个"水仙花数",
    因为153=1的三次方+5的三次方+3的三次方
    	// 153依次可以拿到  1   5   3
    
    3.1,2,3,4四个数字,看这四个数字能组成多少个无重复数字的三位数?都是多少?
    	// 组成三位数。每位上的数是1,2,3,4其中的任意一个
    	// 每位上的数不能重复
    	 1 2 3 4 个位
    	 1 2 3 4 十位
    	 1 2 3 4 百位
    	// 两个输出结果:都是谁?一共多少个?
    
        public static void f1() {
            /*
            1.编写程序,给定一个整数,按相反顺序输出该数。例如,754321, 控制台输出为7654321。
            int num = 1234567;
            // 程序执行后,在控制台打印出7654321
            // 运算符+循环+分支
            // 根据1234567对10取余 可以拿 7
            // 根据1234567除以10   可以拿123456
            // 直到此num为0结束
             */
            int num = 1234567;
            while (num > 0) {
                int value = num % 10;
                System.out.print(value);// 7 6 
                num = num / 10;// 123456
            }
        }
    
        public static void f2() {
            /*
                2.打印出100-999之间所有的水仙花数, 例如:153是一个"水仙花数",
                因为153=1的三次方+5的三次方+3的三次方
                    // 153依次可以拿到  1   5   3
             */
            // 1.依次拿到100-999之间的数  用循环完成
            // 2.根据循环遍历的数,拿到个位、十位、百位  用三个变量来接收
            // 3.求和
            int count = 0;
            for (int i = 100; i < 1000; i++) {
                // 定义三个变量来接收
                int a = i % 10;
                int b = i / 10 % 10;
                int c = i / 100;
                if (i == a * a * a + b * b * b + c * c * c) {
                    count++;
                    System.out.println(i + "为水仙花数");
                }
            }
            System.out.println("一共有" + count + "个");
    
            // 2.使用嵌套来完成
            // 使用三层循环来表示100 - 999 之间数。
            count = 0;
            for (int i = 1; i <= 9; i++) {
                for (int j = 0; j <= 9; j++) {
                    for (int k = 0; k <= 9; k++) {
                        int num = i * 100 + j * 10 + k;
                        if (i * i * i + j * j * j + k * k * k == num) {
                            System.out.println(num + "为水仙花数");
                        }
                    }
                }
            }
            System.out.println("一共有" + count + "个");
        }
    
        public static void f3() {
            /*    
            3.1,2,3,4四个数字,看这四个数字能组成多少个无重复数字的三位数?都是多少?
                // 组成三位数。每位上的数是1,2,3,4其中的任意一个
                // 每位上的数不能重复
                 1 2 3 4 个位
                 1 2 3 4 十位
                 1 2 3 4 百位
                // 两个输出结果:都是谁?一共多少个?
             */
            int count = 0;
            // 1.使用三层循环分别代表个位、十位、百位上的数。数值分别是1,2,3,4
            // 2.判断三层循环遍历的数依次不相等,则代表条件满足。计数即可
            for (int i = 1; i <= 4; i++) {
                for (int j = 1; j <= 4; j++) {
                    if (i != j) {
                        for (int k = 1; k <= 4; k++) {
                            // i = 1 2
                            // j = 1 2 3 4
                            // k = 1 2 3 4
                            if (i != j && i != k && j != k) {
                                System.out.println(i * 100 + j * 10 + k);
                                count++;
                            }
                        }
                    }
                }
            }
            System.out.println(count);
        }
    
    
    4.给一个数组 int[] a = {3,4,5,6,5,5,3,1,7,9,0,4,3,2,1,2,1,2,1,1},里边放了是10以内的数字,找到里边各个数值的出现的次数。 
        public static void f4() {
            /*
             4.给一个数组 int[] a = {3,4,5,6,5,5,3,1,7,9,0,4,3,2,1,2,1,2,1,1},
             里边放了是10(0-9之间的数)以内的数字,找到里边各个数值的出现的次数(统计0-9分别出现多少次)。 
             */
            int[] a = {3, 4, 5, 6, 5, 5, 3, 1, 7, 9, 0, 4, 3, 2, 1, 2, 1, 2, 1, 1};
            // 定义10个int类型的变量来分别保存出现次数
            int num0 = 0;
            int num9 = 0;
            for (int i = 0; i < a.length; i++) {
                if (a[i] == 0) {
                    num0++;
                } else if (a[i] == 9) {
                    num9++;
                }
            }
            System.out.println("0出现的次数:" + num0);
            System.out.println("9出现的次数:" + num9);
    
            // 定义一个长度为10的数组保存出现次数。nums[0]存放0出现的次数 nums[9]保存9出现的次数
            int[] nums = new int[10];
            for (int i = 0; i < a.length; i++) {
                if (a[i] == 0) {
                    nums[0]++;
                } else if (a[i] == 9) {
                    nums[9]++;
                }
            }
            for (int i = 0; i < nums.length; i++)
                System.out.println(i + "出现了" + nums[i] + "次");
    
            //  // 定义一个长度为10的数组保存出现次数。nums[0]存放0出现的次数 nums[9]保存9出现的次数
            //  int[] a = {3, 4, 5, 6, 5, 5, 3, 1, 7, 9, 0, 4, 3, 2, 1, 2, 1, 2, 1, 1};
            int[] nums1 = new int[10];
            for (int i = 0; i < a.length; i++) {
                nums1[a[i]]++;// nums1[3]++ ;nums1[4]++;nums1[5]++
            }
            for (int i = 0; i < nums1.length; i++)
                System.out.println(i + "出现了" + nums1[i] + "次");
        }
    
    5.现在定义如下的一个数组:int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5},要求将以上数组中值为0的去掉,将不为0的值存入一个新的数组,生成的新数组为:int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5} 
    
    public static void f5() {
            /*
                5.现在定义如下的一个数组:int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5},
                要求将不为0的值存入一个新的数组,新数组为:int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5} 
             */
            int[] oldArr = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5};
            // 1. 定义新数组  新数组的长度为原数组中非0数的个数
            int count = 0;
            for (int value : oldArr) {
                // 当前数不为0则统计 
                if (value != 0) count++;
            }
            int[] newArr = new int[count];
    
            // 2.将原数组中的非0数放在新数组中
            for (int i = 0, j = 0; i < oldArr.length; i++) {
                if (oldArr[i] != 0) {
                    // 新数组的长度要比原数组的长度少,所以直接用原数组索引时,肯定会越界
                    newArr[j] = oldArr[i];
                    // 定义一个新的变量来充当新数组索引
                    j++;
                }
            }
            for (int value : newArr) {
                System.out.println(value);
            }
        }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值