模拟:使用代码将你的计算过程表达出来(约等于废话)直接上例题
例题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;
}
}