关于Java中二进制、乌托邦树、最大化化利润案例的学习与收获

本文介绍了如何使用Java编程计算整数二进制中1的个数的三种方法,包括Integer.bitCount、toBinaryString遍历和位运算。此外,还展示了如何通过循环和数组操作解决乌托邦树高度计算及股票交易中的最大利润问题。
摘要由CSDN通过智能技术生成

一、计算二进制中1的个数

1、要点

输入一个整数n,计算其二进制形式中1的个数

2、代码实现

方法一:

原理:

套用Integer.bitCount(n)方法直接计算输入整型n的二进制形式中1的个数

import java.util.Scanner;

public class 二进制中1的个数 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        System.out.println(Integer.bitCount(n));  //Integer.bitCount()方法可以直接计算输入整型数值中1的个数
    }
}

方法二:

原理:

套用Integer.toBinaryString(n)方法将整型n转化为二进制字符串,再一一遍历和统计字符串中1出现的次数

import java.util.Scanner;

public class 二进制中1的个数 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        //方法二
        String a=Integer.toBinaryString(n);    //将整型n转化为二进制字符串
        int count=0;           //统计二进制字符串中1出现的次数
        for (int i = 0; i < a.length(); i++) {  //遍历二进制字符串的每一位
            if (a.charAt(i)==49){   //根据1的ASCII码值判断是否为1
                count++;
            }
        }
        System.out.println(count);
    }
}

方法三:

原理:

运用位运算符“ >> ”,利用循环用1比较输入整型n二进制形式的末位并统计,然后利用“ >> ”,将其向右移一位二进制位,如1101 >> 1   ——>    110

import java.util.Scanner;

public class 二进制中1的个数 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        System.out.println(count);
        //方法三
        int num=0;
        for (int i = 0; i < 32; i++) {
            if (((n>>i)&1)==1){
                num++;
            }
        }
        System.out.println(num);
    }
}

二、乌托邦树

1、案例描述:

实现一个算法得到乌托邦树的高度。介绍如下:

乌托邦树每年经历2个生长周期。每年春天,它的高度都会翻倍。每年夏天,他的高度都会增加1米。

对于一颗在春天开始时种下的高1米的树,问经过指定周期后,树的高度为多少?

2、输入描述:

输入一个数字N(0<=N<=1000),表示指定周期。 

3、输出描述:

输出一个数字,为经过指定周期后树的高度。

1| 3  //输入

2| 6  //输出

4、个人分析:

由题意可知在 n>0 的情况下,我们可以用循环加取余判断法,设初始值为1,在1~n之间,若余数为1则乘2,如余数为0则加一,以此类推

5、代码实现:

import java.util.Scanner;

public class 乌托邦树 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int a=1;
        if (n>0) {
            for (int i = 1; i <= n; i++) {
                if (i%2==1){
                    a=a*2;
                }else{
                    a=a+1;
                }
            }
        }
        System.out.println(a);
    }
}

三、最大化化利润

1、案例描述:

*股票价格每天都在变化,以数组的索引表示交易日,以数组的元素表示每天的股票价格
*可以通过买入和卖出获得利润。一天只能进行一次买入或卖出操作,一次买入加卖出操作称为一   次交易次数。

*你只能交易一次,求使得利润最大的交易策略

2、输入描述

第一行为数字,表示共有N 天

第二行为N个数字Ai,表示每天的股票价格

其中,1<=N,Ai<= 10000

3、输出描述:

输出一行,为交易一次的最大利润(有可能利润为负)。

1| 8               //输入n天
2| 2 5 6 1 4 3 1 3 //输入每天股价
3| 4               //计算并输出最大利润

4、个人分析:

首先可以创建一个数组,存放每天的股价,利用双层循环和基础的数学知识(如下图)

计算每两个数相减后出现的最大值即可:如第一天购买了股票,计算与后4天相减的值,再计算若第二天购买了股票与后三天相减的的值,以此类推,统计出现的最大值

5、代码实现:

import java.util.Scanner;

public class 最大化交易利润 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] arr1=new int[n];

        for (int i = 0; i < arr1.length; i++) {  //将每天的股价存入数组
            arr1[i] = sc.nextInt();
        }
        int max=arr1[1]-arr1[0];  //必须有买有卖
        for (int i = 0; i < arr1.length-1; i++) {  //通过两层循环计算相减的最大值
            for (int j = i+1; j < arr1.length-1; j++) {
                if(arr1[j]-arr1[i]>arr1[j+1]-arr1[i] && arr1[j]-arr1[i]>max){
                    max=arr1[j]-arr1[i];
                }else if (arr1[j+1]-arr1[i]>max){
                    max=arr1[j+1]-arr1[i];
                }

            }
        }
        System.out.println(max);
    }
}

四、个人收获

1、学习了二进制的相关方法和使用

如:

Integer.bitCount(n)方法直接计算输入整型n的二进制形式中1的个数

Integer.toBinaryString(n)方法将整型n转化为二进制字符串

位运算符“ >> ”右移一位二进制位

2、嵌套循环和数组遍历与计算的巩固

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值