//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();}
//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;}