一、计算二进制中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转化为二进制字符串
位运算符“ >> ”右移一位二进制位