题目描述
解题思路
把字符串转换成整数
注意以下几个问题:逻辑问题,判断出最大最小,直接做返回;去空格后的字符串要覆盖之前的字符串;考虑符号。
滑动窗口的最大值
我个人的方法是:滑窗的时候判断去除的元素以及加入的元素与上一窗口最大值的大小比较。但是我的逻辑不够简练。看版本一,提交的时候超过时间限制。而后参考其他人的思路,将逻辑简单化了一下。看版本二。
看其他的解法有说到用单调队列,具体我还没去看。后续再做了解。
代码实现
把字符串转换成整数
package cz;
public class StrToInt_0720 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s="9223372036854775808";
int res=strToInt(s);
System.out.print(res);
}
public static int strToInt(String str) {
//去掉空格
str=str.trim();
int res=0;
long temp=0;
int tag=1;
if (str.matches("^[\\+-]?\\d.*$"))//开头包含数字
{
int i=0;//计算字符串长度
//判断是否有前导符号
if(str.charAt(i)=='-'||str.charAt(i)=='+') {
if(str.charAt(i)=='-') {
tag=-1;
}
i++;
}
while(i<str.length()&&str.charAt(i)<='9'&&str.charAt(i)>='0') {//未遍历结束且仍有数字存在
temp=temp*10+str.charAt(i)-'0';
if(temp*tag<(-Math.pow(2, 31))) return Integer.MIN_VALUE;
if(temp*tag>(Math.pow(2, 31))-1) return Integer.MAX_VALUE;
i++;
}
}
res=(int)temp*tag;
return res;
}
}
滑动窗口的最大值(版本1)
package cz;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Queue;
public class MaxSlidingWindow_0720 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int []nums = {1};
int k = 1;
int [] res=maxSlidingWindow(nums,k);
System.out.print(res[0]);
}
public static int[] maxSlidingWindow(int[] nums, int k) {
//新建数组来保存最大值
int [] res=new int [nums.length-k+1];
//构造list
List<Integer> list = new ArrayList<>();
//取第一个窗口k个数值放入list,
int i=0;
while(i<k)
{
list.add(nums[i]);
i++;
}
//并确定此时第一个窗口的最大值
int flag = Collections.max(list);
//将第一个最大值放入及结果数组中
int ri=0;
res[ri]=flag;
ri++;
//处理剩下的数值
for(int mi=i;mi<nums.length;mi++)
{
//如果列表移出的数值不等于上个窗口的最大值
if(!list.get(0).equals(res[ri-1])) {
//移除列表第一个数
list.remove(0);
//将当前数加入列表
list.add(nums[mi]);
//如果当前数大于上个窗口的最大值,那么当前窗口的最大值为新加入的数,否则最大值不变
if (nums[mi]>res[ri-1]) {
res[ri]=nums[mi];
}
else {
res[ri]=res[ri-1];
}
ri++;
}
//如果列表移出的数值等于上个窗口的最大值
else {
list.remove(0);
list.add(nums[mi]);
//如果移除值小于当前值,则当前值为当前窗口最大值
if (nums[mi]>res[ri-1]) {
res[ri]=nums[mi];
}
//否则做大小判断
//移除第一个值,加入当前值,做大小判断,赋给结果数组
else {
int tflag = Collections.max(list);
res[ri]=tflag;
}
ri++;
}
}
return res;
}
}
滑动窗口的最大值(版本2).。。。未写完,明日继续。