2022/07/20---把字符串转换成整数; 滑动窗口的最大值

本文探讨了两个计算机科学中的算法问题:如何将字符串转换为整数,以及如何找到数组中滑动窗口的最大值。对于字符串转换,文章详细解释了处理符号、边界条件和溢出检查的步骤。而在滑动窗口最大值问题上,作者提供了两种不同的解决方案,一种基于比较,另一种可能涉及单调队列的数据结构。这两个问题都是编程面试和算法学习中的常见题目,对于提升算法思维能力很有帮助。
摘要由CSDN通过智能技术生成

题目描述

把字符串转换成整数

滑动窗口的最大值

解题思路

把字符串转换成整数

注意以下几个问题:逻辑问题,判断出最大最小,直接做返回;去空格后的字符串要覆盖之前的字符串;考虑符号。

滑动窗口的最大值

我个人的方法是:滑窗的时候判断去除的元素以及加入的元素与上一窗口最大值的大小比较。但是我的逻辑不够简练。看版本一,提交的时候超过时间限制。而后参考其他人的思路,将逻辑简单化了一下。看版本二。
看其他的解法有说到用单调队列,具体我还没去看。后续再做了解。

代码实现

把字符串转换成整数

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).。。。未写完,明日继续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值