牛客网(剑指offer)刷题记录
前言
想在刷完题后记录一下自己的思路和吸收的经验,很久之前就想尝试一下写博客,以此为契机,写下这个博客。本人是非计算机、软件专业的打码菜鸟一枚,请多指教。
1. 二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题目链接:二进制中1的个数
自己的做法:
import java.lang.Math;
public class Solution {
public int NumberOf1(int n) {
int num=0;
int top=0;//最高的1所在的位
int remain;
while(Math.pow(2,top)<n){
top++;
}
if(n==0)return 0;
else if(n>=0){
num++;
remain=n-(int)Math.pow(2,--top);
while(remain!=0){
//top--;//将top逐渐缩小,看有多少1
if(remain-Math.pow(2,--top)<0)continue;
else{
remain=remain-(int)Math.pow(2,top);
num++;
}
}
return num;
}
//else return 1;//小于零还没考虑。。。
}
}
在本地是可以的,但是在牛客网上说超时
解法一:使用Integer.toString,从字符串里看
public class Solution {
public int NumberOf1(int n) {
String str=Integer.toBinaryString(n);
int ans=0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='1')
ans++;
}
return ans;
}
}
解法二:使用&按位相与判断
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n != 0){
count += (n & 1); //每次判断最低位是否为1
n >>>= 1;
}
return count;
}
}
貌似,java和c++的负数就是以补码形式表示,所以这里不用对小于零的情况分开讨论。
2. 数值的整数次方
题目链接:数值的整数次方
这个比较简单,不多说。
import java.lang.Math;
public class Solution {
public double Power(double base, int exponent) {
double ans=base;
if(exponent>0)
for(int i=0;i<exponent-1;i++){
ans=base*ans;
}
else if(exponent==0)return 1;
else{