//1.暴力解法(超出时间限制)publicstaticintcountPrimes(int n){int count =0;for(int i =2; i < n; i++){if(isPrimes(i)){
count ++;}}return count;}publicstaticbooleanisPrimes(int num){//如果说num=x*y,则在遍历过程中,x和y只需要利用一个就好//例如:6=2*3,遍历过2就不用遍历3了//因为x和y中的较小值必定在[2,根号下num]范围内,枚举[2,根号下num]即可for(int i =2; i * i <= num; i++){if(num % i ==0){returnfalse;}}returntrue;}
//2.埃氏筛publicstaticintcountPrimes2(int n){int[] isPrime =newint[n];Arrays.fill(isPrime,1);int count =0;for(int i =2; i < n; i++){if(isPrime[i]==1){
count ++;//注意i * i的取值if((long)i * i < n){for(int j = i * i; j < n; j+=i){
isPrime[j]=0;}}}}return count;}
2、七进制数(力扣504)
//1.先%再/publicStringconvertToBase7(int num){if(num ==0)return"0";StringBuilder sb =newStringBuilder();int cur = num <0?-num : num;while(cur >0){
sb.append(cur %7);
cur /=7;}if(num <0) sb.append("-");return sb.reverse().toString();}
3、数字转换为十六进制数(力扣405)
//1.利用进制转换规律/*
* 使用无符号右移 >>>
* */publicstaticStringtoHex(int num){StringBuilder sb =newStringBuilder();char[] arr ="0123456789abcdef".toCharArray();if(num ==0)return"0";while(num !=0){//计算num二进制的后四位表示的十进制数的大小int temp = num &15;
sb.append(arr[temp]);//二进制->16进制,每四位二进制转换为一位16进制
num = num >>>4;}return sb.reverse().toString();}
4、Excel表列名称(力扣168)
publicStringconvertToTitle(int columnNumber){StringBuilder sb =newStringBuilder();while(columnNumber >0){int len = columnNumber %26;//特别注意这一步,因为转换不是从0开始的if(len ==0){
len =26;
columnNumber -=1;}
sb.append((char)('A'+ len -1));
columnNumber /=26;}return sb.reverse().toString();}
//1.位运算publicstaticStringaddBinary(String a,String b){int m = a.length()-1, n = b.length()-1;StringBuilder sb =newStringBuilder();int count =0;//循环相加两个字符串相同长度的低位数部分while(m >=0&& n >=0){int sum = count;
sum += a.charAt(m--)-'0';
sum += b.charAt(n--)-'0';//进位
count = sum /2;//当前位的值
sb.append(sum %2);}// 如果 a 还没遍历完成(a串比b串长),则继续遍历添加 a 的剩余部分while(m >=0){int sum = count + a.charAt(m--)-'0';
count = sum /2;
sb.append(sum %2);}// 如果 b 还没遍历完成(b串比a串长),则继续遍历添加 b 的剩余部分while(n >=0){int sum = count + b.charAt(n--)-'0';
count = sum /2;
sb.append(sum %2);}//如果count不等于0 还有个进位数没加进去,需要补充if(count ==1){
sb.append(count);}//反转字符串获得正常结果return sb.reverse().toString();}
7、字符串相加(力扣415)
//1.思路很简单(只不过是十进制)publicstaticStringaddStrings(String num1,String num2){StringBuilder sb =newStringBuilder();int m = num1.length()-1,n = num2.length()-1;int count =0;while(m >=0&& n >=0){int sum = count;
sum += num1.charAt(m--)-'0';
sum += num2.charAt(n--)-'0';
count = sum /10;
sb.append(sum %10);}while(m >=0){int sum = count + num1.charAt(m--)-'0';
count = sum /10;
sb.append(sum %10);}while(n >=0){int sum = count + num2.charAt(n--)-'0';
count = sum /10;
sb.append(sum %10);}if(count ==1){
sb.append(1);}return sb.reverse().toString();}
//2. 1的简化版publicstaticStringaddStrings2(String num1,String num2){int m = num1.length()-1,n = num2.length()-1;StringBuilder sb =newStringBuilder();int count =0;//只要满足以下条件,都可以计算while(m >=0|| n >=0|| count !=0){//注意下面这一步int sum1 = m >=0? num1.charAt(m--)-'0':0;int sum2 = n >=0? num2.charAt(n--)-'0':0;int sum = sum1 + sum2 + count;
count = sum /10;
sb.append(sum %10);}return sb.reverse().toString();}
8、最少移动次数使数组元素相等 II(力扣462)
//1.把每个元素都变为中位数即可/*
* 假如数组长度为奇数2n+1 则中位数两边各有n个数
* 设左边所有数和中位数的差值和为x 右边所有数和中位数的差值和为y
* 则所有需要移动的次数为x+y 如果不选择中位数 例如选择中位数-1
* 这样总的移动次数就变成了 >= ((x-n) + (y+n) + 1) 最好的情况下比中位数大1
* 如果数组长度是偶数 有两个中位数 选择两个中位数的任何一个或
* 者两个中位数的平均数 都是可以的
* */publicstaticintminMoves2(int[] nums){int len = nums.length;Arrays.sort(nums);//选择中位数int midNum = nums[len /2];int max =0;for(int i =0; i < len; i++){
max +=Math.abs(nums[i]- midNum);}return max;}
//1.二分法publicstaticbooleanisPowerOfThree(int n){//看n是否是3的幂次long left =0,right = n,mid,guessNum;while(left <= right){
mid =(left + right)>>1;
guessNum =(long)Math.pow(3, mid);if(guessNum == n){returntrue;}elseif(guessNum < n){
left = mid +1;}else{
right = mid -1;}}returnfalse;}
//2.找规律publicstaticbooleanisPowerOfThree2(int n){int count =2;while(n >=3){
n -= count;
count *=3;}return n ==1;}
//3.迭代法publicstaticbooleanisPowerOfThree3(int n){if(n <1){returnfalse;}//说明n是3的倍数while(n %3==0){
n /=3;}return n ==1;}
//4.找规律publicstaticbooleanisPowerOfThree4(int n){//int类型中最大的3的幂次为1162261467return n >0&&1162261467% n ==0;}
11、 除自身以外数组的乘积(力扣238)
//1.(分为左右两部分,分别计算)降低时间复杂度publicstaticint[]productExceptSelf(int[] nums){int len = nums.length;int[] res =newint[len];//res[i]表示i左边的数的乘积
res[0]=1;for(int i =1; i < len; i++){
res[i]= nums[i -1]* res[i -1];}//乘完左边乘右边int right =1;for(int i = len -1; i >=0; i--){
res[i]= res[i]* right;
right *= nums[i];}return res;}
数学1、计数质数(力扣204)1、计数质数(力扣204)//1.暴力解法(超出时间限制) public static int countPrimes(int n) { int count = 0; for (int i = 2; i < n; i++) { if(isPrimes(i)){ count ++; } } return count;