• 算法通关村第13关【青铜】| 数字与数学基础问题


    数字统计专题

    1.数组元素积的符号

    思路:每回碰到负数就取反

    1. class Solution {
    2. public int arraySign(int[] nums) {
    3. int res = nums[0];
    4. if(nums[0]>0){
    5. res = 1;
    6. }else if(nums[0]<0){
    7. res = -1;
    8. }else{
    9. return res;
    10. }
    11. for(int i = 1;i
    12. if(nums[i]<0){
    13. res = -res;
    14. }else if(nums[i] == 0){
    15. return 0;
    16. }
    17. }
    18. return res;
    19. }
    20. }

     2.阶乘尾数

    思路:15!= 1*2*3*4*5*6*7*8*9*(2*5)11*12*13*14*15

    可以发现2的因子是肯定会比5的因子多,而只要拆分中出现2*5=10结果就会多一个0,所以问题就转换为求出有多少个为5的因子

    1. class Solution {
    2. public int trailingZeroes(int n) {
    3. int count = 0;
    4. int num = 5;
    5. while(n>=num){
    6. count += n/num;
    7. n = n/5;
    8. }
    9. return count;
    10. }
    11. }

    溢出问题

    1.整数反转

    思路:反转方法有使用栈、字符串转整数、取模,这里使用取模更好

    判断溢出的方法:max/10>num

    1. class Solution {
    2. public int reverse(int x) {
    3. int res = 0;
    4. int max = Integer.MAX_VALUE;
    5. while(x != 0){
    6. int t = x%10;
    7. System.out.print(t);
    8. if(res>max/10||res == max/10 && t >7){
    9. return 0;
    10. }
    11. if(res<-max/10||res == max/10 && t <=-8){
    12. return 0;
    13. }
    14. res = res*10 + t;
    15. x=x/10;
    16. }
    17. return res;
    18. }
    19. }

     2.回文数

    思路:判断回文方法双指针、截取一半比较

    1. class Solution {
    2. public boolean isPalindrome(int x) {
    3. if(x < 0){
    4. return false;
    5. }
    6. if(x %10 == 0 && x != 0){
    7. return false;
    8. }
    9. int book = 0;
    10. while(x>book){
    11. book = book*10+x%10;
    12. x /= 10;
    13. }
    14. return x==book || x == (book/10);
    15. }
    16. }

    进制问题

    1.七进制数

    思路:

    1. 二进制到十进制

      • 二进制数每一位的权值为2的幂,从右往左依次是1、2、4、8、16...
      • 将二进制数的每一位与对应权值相乘,然后求和即可得到十进制数。

      例如,二进制数1011转换为十进制:(1 * 2^3) + (0 * 2^2) + (1 * 2^1) + (1 * 2^0) = 8 + 0 + 2 + 1 = 11。

    2. 八进制到十进制

      • 八进制数每一位的权值为8的幂,从右往左依次是1、8、64、512...
      • 将八进制数的每一位与对应权值相乘,然后求和即可得到十进制数。
    3. 十六进制到十进制

      • 十六进制数每一位的权值为16的幂,从右往左依次是1、16、256、4096...
      • 将十六进制数的每一位与对应权值相乘,然后求和即可得到十进制数。需要注意的是,十六进制中的A表示10,B表示11,C表示12,D表示13,E表示14,F表示15。
    4. 十进制到其他进制

      • 将十进制数不断除以目标进制的基数,取余数作为新进制数的一位,直到商为0。
      • 反转余数的顺序,即可得到目标进制数。

      例如,将十进制数231转换为二进制:

      • 231 / 2 = 115 余 1
      • 115 / 2 = 57 余 1
      • 57 / 2 = 28 余 1
      • 28 / 2 = 14 余 0
      • 14 / 2 = 7 余 0
      • 7 / 2 = 3 余 1
      • 3 / 2 = 1 余 1
      • 1 / 2 = 0 余 1

      反转余数的顺序为 11100111,即231的二进制表示。

    5. 其他进制到其他进制

      • 可以通过先将原数转换为十进制,然后再从十进制转换为目标进制来实现。
    1. class Solution {
    2. public String convertToBase7(int num) {
    3. StringBuilder sb = new StringBuilder();
    4. int sign = num<0 ? 1 : 0;
    5. if(num < 0){
    6. num = -num;
    7. }
    8. do{
    9. sb.append(num%7);
    10. num = num /7;
    11. }while(num>0);
    12. if(sign == 1){
    13. sb.append("-");
    14. }
    15. return sb.reverse().toString();
    16. }
    17. }

     2.转换为N机制

    1. public static String convert(int M, int N) {
    2. Boolean flag = false;
    3. if (M < 0) {
    4. flag = true;
    5. M *= -1;
    6. }
    7. StringBuffer sb = new StringBuffer();
    8. int temp;
    9. while (M != 0) {
    10. temp = M % N;
    11. //技巧一:通过数组F[]解决了大量繁琐的不同进制之间映射的问题
    12. sb.append(F[temp]);
    13. M = M / N;
    14. }
    15. //技巧二:使用StringBuffer的reverse()方法,让原本麻烦的转置瞬间美好
    16. sb.reverse();
    17. //技巧三:最后处理正负,不要从一开始就揉在一起。
    18. return (flag ? "-" : "") + sb.toString();
    19. }
  • 相关阅读:
    JavaEE-多线程初阶1
    锁执行的过程
    [语音识别] 基于Python构建简易的音频录制与语音识别应用
    【广州华锐互动】利用VR开展高压电缆运维实训,提供更加真实、安全的学习环境
    杭电oj 2040 亲和数 C语言
    集成学习、装袋法、提升法、GBDT、随机森林(机器学习)
    前端基础:BFC
    JavaScript 中常用和必备的一些工具类函数
    论文解读 | KPConv——点云上的可形变卷积网络
    【位运算】必知必会:二进制位的原码反码补码转换 以及 按位与&、按位或|、异或^
  • 原文地址:https://blog.csdn.net/Candy___i/article/details/132774066