算法通关村第13关【白银】| 数字与数学高频问题

2023-09-14 16:44:04

数组实现加法

1.加一

思路:不进位末尾加一,进位挨个加一

99,999...进位,新建长度+1的数组,res[0]=1,直接返回

lass Solution {
    public int[] plusOne(int[] digits) {
        for(int i = digits.length-1;i>=0;i--){
            int num = ++digits[i];
            if(num<10){
                return digits;
            }else{
                digits[i] = num % 10;
            }
        }
        int[] res = new int[digits.length + 1];
        res[0] = 1;
        return res;
    }
}

2.字符串相加

思路:从尾部加起,记录进位/10,本位%10,位数不一样0补齐

class Solution {
    public String addStrings(String num1, String num2) {
        char[] s1 = num1.toCharArray();
        char[] s2 = num2.toCharArray();
        StringBuilder sb = new StringBuilder();
        int len1 = s1.length-1;
        int len2 = s2.length-1;
        int carry = 0;
        while(carry != 0 || len1>=0||len2>=0){
            int n1 = 0;
            int n2 = 0;
            if(len1>=0&&len2>=0){
                n1 = s1[len1] - '0';
                n2 = s2[len2] - '0';
            }
            else if(len2<0&&len1<0){
                n1 = 0;
                n2 = 0;
            }
            else if(len1<0){ 
                n2 = s2[len2] - '0';
                n1=0;
            }
            else if(len2<0){
                n1 = s1[len1] - '0';
                n2=0;
            }        
            int num = n1+n2+carry;
            if(num>=10){
                sb.append(num%10);
                carry = num/10;
            }else{
                sb.append(num);
                carry = 0;
            }
            len1--;
            len2--;
        }
        return sb.reverse().toString();
    }
}

3.二进制加法

思路:和十进制加法一样,逢二进一/2,本位取模%2,位数不一样0补齐

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        int len1 = a.length();
        int len2 = b.length();
        for(int i = len1 - 1,j = len2 - 1;(i>=0||j>=0||carry!=0);i--,j--){
            int n1 = i >= 0? a.charAt(i) - '0' : 0;
            int n2 = j >= 0? b.charAt(j) - '0' : 0;
            int n = n1 + n2 + carry;
            if(n>=2){
                sb.append(n%2);
                carry = n/2;
            }else{
                sb.append(n);
                carry = 0;
            }
        }
        return sb.reverse().toString();
    }
}

幂运算

1.2的幂

思路:每次除2直到除到底是不是能除尽,也就是2的n次方等于n。

class Solution {
    public boolean isPowerOfTwo(int n) {
        if(n%2!=0&&n!=1||n==0){
            return false;
        }
        while(n%2==0){
            n = n >> 1;
        }
        if(n!=1){
            return false;
        }else{
            return true;
        }
    }
}

解法二:位运算,2的n次方说明首位为1其他位都是0,通过n&(n-1)将末尾1变0 比较是否为0 

public static boolean isPowerOfTwo2(int n) {
        return n > 0 && (n & (n - 1)) == 0;
    }

2.3的幂

思路:同上一题,2变成3

class Solution {
    public boolean isPowerOfThree(int n) {
        if(n%2==0||n<=0){
            return false;
        }
        while(n%3==0){
            n /= 3;
        }
        return n == 1;
    }
}

解法二:位运算,int范围内3的最高幂次数是3的19次方1162261467,只需要去除n能除整就是

public static boolean isPowerOfThree2(int n) {
        return n > 0 && 1162261467 % n == 0;
    }

3.4的幂

class Solution {
    public boolean isPowerOfFour(int n) {
        if(n == 1){
            return true;
        }
        if(n%2!=0||n<=0){
            return false;
        }
        while(n%4 == 0){
            n /= 4;
        }
        return n == 1;
    }
}

解法二:位运算,4(2^2)的n次方说明首位为1其他位都是0,同时它还是2的n次方,特别的首位1处在奇数位置上,例如:100、10000,通过n&(n-1)将末尾1变0 比较是否首位为1其他位为0,再然后判断1是不是在奇数位置上,也就是&偶数位全是1奇数为全是0,如果偶数位为1就false

class Solution {
    public boolean isPowerOfFour(int n) {
        return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0;
    }
}

4.幂函数

思路:快速幂,折半乘

快速幂+递归,遇到奇数*x

class Solution {
    public double myPow(double x, int n) {
        if(x==1||n==0){
            return 1.0;
        }
        if(x == 0){
            return 0.0;
        }
        long N = n;
        return n>0 ? quickMul(x,N) : 1.0/quickMul(x,-N);
        
    }

    public double quickMul(double x,long n){
        if(n == 0){
            return 1.0;
        }
        double res = quickMul(x,n/2);
        if(n%2==1){
            return res*res*x;
        }else{
            return res*res;
        }
    }
}

快速幂+迭代

13的二进制为1101,15的二进制为1111

3^13=3^8*3^4*3^0*3^1

再如3^15 = 3^8*3^4*3^2*3^1

进行幂次方拆分,从低位1开始每循环右移一次就x平方一次,遇见1结果就*x

class Solution {
    public double myPow(double x, int n) {
        if(x==1||n==0){
            return 1.0;
        }
        if(x == 0){
            return 0.0;
        }
        long N = n;
        if(n<0){
            N = -N;
        }
        double res = 1.0;
        while(N>0){
            if((N & 1) == 1){
                res = res*x;
            }
            x *= x;
            N = N/2;
        }
        return n<0 ? 1.0/res : res;
    }
}

更多推荐

hadoop集群搭建

vim/etc/hosts192.168.1.2Master.Hadoop192.168.1.3Slave1.Hadoop192.168.1.4Slave2.Hadoop192.168.1.5Slave3.Hadoop若能用主机名进行ping通,说明刚才添加的内容,在局域网内能进行DNS解析。hadoop:https:

【iOS】浅析static,const,extern关键字

文章目录前言一、staticstatic修饰局部变量static修饰全局变量总结二、const三、extern声明全局变量声明函数在头文件中使用总结前言笔者本周在学习单例模式时,用到了static关键字,特此总结博客记录学习static,const,extern关键字的过程一、staticstatic——静态,我们将用

【golang】实现通用的get/post请求(接受一个 URL 和一个结构体参数)

通用的GET请求实现一个通用的GET请求函数,该函数接受一个URL和一个结构体参数,并将结构体参数编码为查询参数。以下是一个通用的示例代码:packagemainimport("fmt""net/http""net/url""reflect""strings")funcgetFunc(baseUrlstring,str

Learn Prompt-ChatGPT 精选案例:简单介绍

恭喜你!现在你已经学会了如何编写提示语。本节主要讨论的是如何使用提示语来解决我们在日常或工作中遇到的任务。如果你已经有了一个提示语集,如何决定哪些提示语适合手头的任务?在本节中,我们将通过一些实际例子来给你提供灵感。在挑选案例的时候,我们更加希望展示的是如何将复杂的工作任务拆解成相互关联的小任务。例如在PPT制作中,我

【C++代码】平衡二叉树,二叉树的所有路径,左叶子之和--代码随想录

题目:平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。题解这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过1,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉

解决Java应用程序中的SQLException:Access denied for user ‘root‘@‘localhost‘ 错误

目录问题背景解决方案如何重置MySQLroot密码:问题背景java.sql.SQLException:Accessdeniedforuser'root'@'localhost'(usingpassword:YES)atcom.mysql.cj.jdbc.exceptions.SQLError.createSQLExc

CSS复习之选择器

目录一、常用选择器1.1元素选择器1.2id选择器1.3class选择器二、复合选择器2.1交集选择器2.2并集选择器三、关系选择器3.1子元素选择器3.2后代选择器3.3兄弟选择器四、属性选择器五、伪类选择器六、伪元素的选择器七、超链接的伪类一、常用选择器1.1元素选择器作用:根据标签名来选中指定的元素语法:标签名{

固定资产管理措施怎么写

固定资产管理措施是指企业在进行固定资产管理时所采取的各种措施和方法。以下是一些常见的固定资产管理措施:加强固定资产的安全保护。该公司采取了多种安全措施建立完善的固定资产管理制度。制定明确的资产采购、使用、维护、报废等流程和标准,确保资产管理的规范性和透明度。采用先进的资产管理软件。通过数字化手段对固定资产进行管理和监控

unity打包后无法读取Excel解决方法

一、前言最近几乎遇到了所有能遇到的unity读取Excel的问题。因为使用的是unity5.4,而且还是32位。所以出现各种问题在所难免。废话不多说,现有的现象是:在unity的编辑器里可以完美运行,读取Excel不成问题,但是打包成exe后就无法读取到对应路径下的Excel表格了。二、解决办法第一种,未能解决:在脚本

BANI时代下,项目如何实现价值交付?

随着时代的变化,继VUCA时代后、新的语言出现:BANI一词逐渐流行起来。BANI,取自四个英文单词Brittle(脆弱的)、Anxious(焦虑的)、Nonlionear(非线性的)、Incomprehensible(费解的)首字母的大写。Brittleness(脆弱性):在BANI时代,系统和组织可能会突然、且无预

晨控CK-FR102系列与汇川AC800系列MODBUSTCP通讯手册

晨控CK-FR102系列与汇川AC800系列MODBUSTCP通讯手册晨控CK-FR102AN系列是一款基于射频识别技术的高频双通道读写器,读写器工作频率为13.56MHZ,支持对I-CODE2、I-CODESLI等符合ISO15693国际标准协议格式标签的读取。高频双通道读写器支持标准工业通讯协议ModbusTCP,

热文推荐