模拟算法(持续更新)

模拟:使用代码将你的计算过程表达出来(约等于废话)直接上例题

例题1: 复数 可以用字符串表示,遵循 “实部+虚部i” 的形式,并满足下述条件:

实部 是一个整数,取值范围是 [-100, 100]
虚部 也是一个整数,取值范围是 [-100, 100]
i2 == -1
给你两个字符串表示的复数 num1 和 num2 ,请你遵循复数表示形式,返回表示它们乘积的字符串。

在这里插入图片描述

// 我看到题解所得这道题使用的方式是模拟:使用代码将你的计算过程表达出来
// 这不废话?
class Solution {
    public String complexNumberMultiply(String num1, String num2) {
    //    首先因为色集计算我们肯定得将字符转化位整数,因为它遵循:实部+虚部i
    // 所以首先可以通过+将字符串分割

    // 因为正则表达式中"+“为特殊符号,是量词,表示{1,},因此,要匹配”+“这个字符,需要转义”\+",java中要"\\+"
    String[] arry1=num1.split("\\+");
    String[] arry2=num2.split("\\+");
    // 先转化num1
    // 将分割出来的字符串转化位整数        

    int pre1=0;
    int last1=0;
    // 判断实数数部分是正数还是负数
    if(arry1[0].charAt(0)=='-'){
        arry1[0]=arry1[0].replace("-","");
        pre1=-Integer.parseInt(arry1[0]);
    }else{
        pre1=Integer.parseInt(arry1[0]);
    }
   
    // 首先将虚数部分的i去掉
    arry1[1]=arry1[1].replace("i","");
    // 判断虚数部分是正数还是负数
    if(arry1[1].charAt(0)=='-'){
        // 去掉符号
         arry1[1]=arry1[1].replace("-","");
        // 将负数转化位整数
        last1=0-Integer.parseInt(arry1[1]);
    }else{
        last1=Integer.parseInt(arry1[1]);
    }

    // 步骤根上面一样转化num2
    int pre2=0;
    int last2=0;
    // 判断实数数部分是正数还是负数
    if(arry2[0].charAt(0)=='-'){
        arry2[0]=arry2[0].replace("-","");
       pre2=-Integer.parseInt(arry2[0]);
    }else{
        pre2=Integer.parseInt(arry2[0]);
    }
   
    // 首先将虚数部分的i去掉
    arry2[1]=arry2[1].replace("i","");
    // 判断虚数部分是正数还是负数
    if(arry2[1].charAt(0)=='-'){
        // 去掉符号
         arry2[1]=arry2[1].replace("-","");
        // 将负数转化位整数
        last2=0-Integer.parseInt(arry2[1]);
    }else{
        last2=Integer.parseInt(arry2[1]);
    }

    // 利用上面转化求得的函数进行计算
    int pre=pre1*pre2-last1*last2;
    String last=(pre1*last2+last1*pre2)+"i";
    return pre+"+"+last;
    }
}

例题2: 给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
在这里插入图片描述

// 我不理解这跟哈希表有什么关系?直接将字符串转化为对应的分钟数
// 然后两两相减求出最小的时间差不久完事了?
class Solution {
    public int findMinDifference(List<String> timePoints) {
        // 创建一个数组保存由字符串转化而来的分钟数
        int[] array=new int[timePoints.size()];
        // 创建一个变量来保存最小时间差
        int mintime=Integer.MAX_VALUE;

        // 使用循环将所有的字符串转化为分钟数
        for(int i=0;i<timePoints.size();i++){
            int sum=0;
            String temp=timePoints.get(i);
            // 将字符串由:分割为两部分
            String[] num=temp.split(":");
            // 首先将小时转化为分钟
            if(num[0].equals("00")){
                sum=sum+24*60;
            }else{
                 sum=sum+Integer.parseInt(num[0])*60;
            } 
             sum=sum+Integer.parseInt(num[1]);
            // 将转化后的小时数保存到数组中
            array[i]=sum;
        }

        // 对我们的数组进行排序,然后两两相减求出最小的时间差
        Arrays.sort(array);
        for(int i=1;i<array.length;i++){
            if(array[i]-array[i-1]<mintime){
                mintime=array[i]-array[i-1];
            }
        }
         
        //  下面的这个地方十分的关键,因为如果只有两个时间节点的话,是存在两端弧长的,取较短的一段
         return Math.min(mintime,1440-(array[array.length-1]-array[0])); //注意有可能存在首尾两个差值是最小
    }
}

例题3: Z 字形变换(leetcode:6)
在这里插入图片描述
在这里插入图片描述

// 思路:只要找到每个字母英爱位于那一行,然后使用散列表将每一行的字母保存下来,最后连接再一起即可
//使用一个变量控制位置的加减即可
class Solution {
    public String convert(String s, int numRows) {
 
    // 避免异常
    if(s.length()==0 || numRows < 1) return "";
    if(numRows == 1) return s;
    //   首先创建一个散列表来保存每一行的字母
    List<Character>[] list=new List[numRows];
    // 为每个集合赋值空间
    for(int i=0;i<numRows;i++){
        list[i]=new ArrayList<Character>();
    }

    // 使用一个变量来记录字符应该放在那个集合
    int position=0;
    // 创建一个变量控制position时上升还是下降 true上升 false下降
    boolean con=true;
    // 遍历字符串将字符放到对应的集合里面去
    for(int i=0;i<s.length();i++){
         list[position].add(s.charAt(i));

        // 判断是否需要更改con
        // 我去你大舅的,搞了十几分钟忘记加()了
        if(i%(numRows-1)==0&&i!=0){
            con=!con;
        } 

         if(con){
            position++;
        }else{
            position--;
        }
    }

    String res="";
    // 最后将每个集合中的字符拼接起来
    for(int i=0;i<numRows;i++){
        for(char ch:list[i]){
            res=res+ch;
        }
    }

    return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值