目录
2.用Integer.bitCount可以统计2进制中1的个数
题目描述:
给定一个整数 xx,输出该数二进制表示中 1 的个数。
例:9 的二进制表示为 1001,有 2 位是 1 ,所以函数返回 2。
输入描述
输入 x (内存空间为 32 位的整数)。
输出描述
第一行输出 x 二进制表示中 1 的个数。
输入输出样例
示例 1
输入
9
输出
2
思路分析:
x内存空间为 32 位的整数,int32位正好够用
1.用Integer.toString(n,2)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
String s = Integer.toString(n,2);
int ans=0;
for(int i=0;i<s.length();i++) {
if(s.charAt(i)=='1') ans++;
}
System.out.println(ans);
}
}
2.用Integer.bitCount可以统计2进制中1的个数
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int ans=Integer.bitCount(n);
System.out.println(ans);
}
}
3.用位运算
&两边都为1才为1
x&1 只有x的个位为1才会返回1
比如101&1=1
10&1=0
1&1=0
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int ans=0;
while(n>0) {
if((n&1)==1) ans++;
n>>=1;
}
System.out.println(ans);
}
}
题目描述
实现一个算法确定一个数字 N 是否为 2 的幂。
若该数字是 2 的幂则输出 YES
,否则输出 NO
。
输入描述
输入一个数字 N(1 <= N <=10^8)。
输出描述
输出一行,若 N 是 2 的幂则输出 YES
,否则输出 NO
。
输入输出样例
示例
输入
8
输出
YES
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
System.out.println(Integer.bitCount(n)==1?"YES":"NO");
}
}
最大化交易利润
题目描述
实现一个算法寻找最大化股票交易利润的策略。介绍如下:
- 股票价格每天都在变化,以数组的索引表示交易日,以数组的元素表示每天的股票价格。
- 可以通过买入和卖出获得利润。一天只能进行一次买入或卖出操作,一次买入加卖出操作称为一次交易次数。
- 你只能交易一次,求使得利润最大的交易策略。
输入描述
第一行为数字 N,表示共有 N 天。
第二行为 N 个数字 A_iAi,表示每天的股票价格。
其中,1 <=N, Ai <=10^4。
输出描述
输出一行,为交易一次的最大利润(有可能利润为负)。
输入输出样例
示例
输入
8
2 5 6 1 4 3 1 3
输出
4
思路分析:
如果你想在第x天把它卖出,那一定是在【1,x-1】中价格最低的一天把它买入
循环遍历,当你遍历第x天,你是不是一定已经遍历过【1,x-1】,同时维护最小值。
枚举在哪一天卖出,然后减去维护的最小值,这个最小值一定在它之前,因为我们是从前面过来的
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
for(int i=0;i<n;i++) {
a[i]=sc.nextInt();
}
//利润
int ans=(int)-1e4;
//在这之前价格最低的时候是多少
int min=(int)1e4;
//时间复杂度o(n)
for(int i=0;i<n;i++) {
//枚举每一天把他卖出 也就是找差最大的
if(i>0) ans=Math.max(ans, a[i]-min);
min=Math.min(min, a[i]);
}
System.out.println(ans);
}
}