力扣(二)

目录

罗马转整数

 方法一:使用Map容器存储罗马数字对

方法一的改进版本 

最长公共前缀

 有效的括号


简单题

罗马转整数

题目描述

 方法一:使用Map容器存储罗马数字对

具体代码:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class romantoInt {
    public int romanToInt(String s) {
        if(s.length()==0)
            return 0;
        Map<Character,Integer> romanToIntMap=initialMap();//创建map
        int result=0;
        for(int i=0;i<s.length();i++){
            char currentRoman=s.charAt(i);//获得第i个字符
            int currentInt=romanToIntMap.get(currentRoman);//用第i个字符获得相应的数字
            if(i!=s.length()-1){
                char nextRoman=s.charAt(i+1);//获得第i+1一个字符
                int nextInt=romanToIntMap.get(nextRoman);//用第i+1个字符获得其对应的数字
                if(currentInt<nextInt){
                    result=result+nextInt-currentInt;
                    i=i+1;
                    continue;
                }
            }
            result=result+currentInt;
        }
        return result;
    }
    public Map<Character,Integer> initialMap(){
        Map<Character,Integer> map=new HashMap<>();
        map.put('I',1);
        map.put('V',5);
        map.put('X',10);
        map.put('L',50);
        map.put('C',100);
        map.put('D',500);
        map.put('M',1000);
        return map;
    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String s=sc.next();
        romantoInt ro=new romantoInt();
        System.out.println(ro.romanToInt(s));
    }
}

测试结果:

 具体思路:

1.创建一个方法,用来创建Map容器,key是罗马数字,value是阿拉伯数字

2.在罗马字符转为整数的方法里面调用创建Map容器的方法,得到一个所需的Map容器

3.首先,在一串罗马字符里面,使用for循环,从第一个罗马字符开始

3.1如果这个字符不是最后一个字符,那么就获取它的下一个字符。不分这种情况的话,那么会发生溢出问题。

3.1.1.获取得到下一个字符,比较下一个字符对应的value(nextInt)与此字符对应的value(currentInt)

  • 如果nextInt要大于currentInt,那么就在总值上面加上nextInt-currentInt,并使i的值加一!(因为如果现在循环到的currentInt与它下一个字符对应的nextInt已经看成了一个整体,参与了计算,所以下一个要计算的字符应该是现在所循环到的字符的后面两个字符,由于for循环的小括号会执行i+1,所以在执行完这步操作后,只需对i+1,并使用continue继续下一个循环)
  • 如果nextInt不大于currentInt,直接在总值里面加上这个字符对应的Value

3.2.如果是最后一个字符的话那么就不获取下一个字符了,直接在总值里面加上这个字符对应的Value。循环结束。

方法一的改进版本 

测试结果:

 具体改动的地方在此步骤

3.1.1.获取得到下一个字符,比较下一个字符对应的value(nextInt)与此字符对应的value(currentInt)

  • 如果nextInt要大于currentInt,那么就在总值上面加上-currentInt(当前数值的负值)
  • 如果nextInt不大于currentInt,直接在总值里面加上currentInt(当前数值)

 具体改动的地方如下代码,可与上方进行对比

    public int romanToInt(String s) {
        if(s.length()==0)
            return 0;
        Map<Character,Integer> romanToIntMap=initialMap();//创建map
        int result=0;
        for(int i=0;i<s.length();i++){
            int currentInt=romanToIntMap.get(s.charAt(i));//获取当前字符对应的数值
            if(i!=s.length()-1){
                int nextInt=romanToIntMap.get(s.charAt(i+1));//获取下一个字符对应的数值
                if(currentInt<nextInt){
                    result=result-currentInt;
                    continue;
                }
            }
           result=result+currentInt;
        }
        return result;
    }

最长公共前缀

题目描述:

 具体代码:

class solution {
    public String findpublic(String a,String b){

        while (!b.startsWith(a)){
            if(a.length()==1)
                return "";
            a=a.substring(0,a.length()-1);
        }//当b不含a这个公共前缀,就把a截取一个字符,直到包含a这个字符串的公共前缀
        String str=a;
        return str;
    }//查找两个字符串的公共前缀字符串
    public String longestCommonPrefix(String[] strs) {
        
        if(strs.length==1)
            return strs[0];
        String  string=findpublic(strs[0],strs[1]);//算出数组前两个的公共前缀
        if(strs.length>2){
            for(int i=2;i<strs.length;i++){
                string=findpublic(string,strs[i]);//之前的公共前缀与数组元素一个个的进行再筛选公共前缀
            }
        }
        return string;
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //输入数组
        String str=sc.nextLine();//输入数组的内容,可以读取一整行,包括空格
        str=str.replaceFirst("\\[","");
        str=str.replaceFirst("\\]","");
        str=str.replaceAll("\\W","");
        String arr[]=str.split(",");//拆分字符串成字符串数组

        solution pb=new solution();
        System.out.println(pb.longestCommonPrefix(arr));
    }
}

测试结果: 

 具体思路:

  1. 需要自己定义两个方法,一个方法用来找出两个字符串的公共前缀,另外一个方法,用来找出一个数组里面所有元素的公共前缀。
  2. 找出两个字符串的公共前缀,需要用到String的startsWith()和substring()方法。比较a,b两个字符串,用startsWith()方法看b是否包含a这个前缀,如果不包含,首先考虑a的长度是否为1,如果为1那么就直接return""   接着用substring()方法,把a截取掉最后一位字符,直到找出a与b公共的字符
  3. 使用for循环,调用查找两个数的公共前缀的方法,先把前两个的公共前缀找出来,然后再将前面找到的公共前缀与数组后面的元素再进行查找公共前缀

 有效的括号

 题目描述:

 

 

 测试结果:

 具体代码:

class Solution {
    public boolean isValid(String s) {
    
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '(' || c == '[' || c == '{') {
                stack.push(c);
            }//如果遇到左括号类型的那么就把它加进去
         else if (c == ')'&&!stack.isEmpty()&&stack.pop() == '(' || c == ']' &&!stack.isEmpty()&&stack.pop() == '[' || c == '}' &&!stack.isEmpty()&& stack.pop() == '{');
            else return false;
        }
        return stack.isEmpty();
    }
     public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String s=sc.next();
        Solution solu=new Solution();
        System.out.println(solu.isValid(s));
    }
}

具体思路:

考虑到,题目的括号是越先输入的左括号越后收括号,即先进后出的特点,所以用stack来进行存储字符串的每个字符。

1.对字符串进行遍历操作

1.1遇到左括号,那么就把左括号放进stack里面;

1.2遇到右括号那么就使用pop方法看stack顶部的元素是否为对应的左括号,并且pop方法还能把对应的左括号从顶部删除。(此时要注意,会存在一种情况,只存在右括号,不存在左括号,那么stack里面就不会有元素存在,这个时候调用pop方法就会出错,因为stack里面压根不存在元素)所以,还需要加一个条件,即stack不为空。

1.3如果上面两种情况都不符合(即为右括号但是却与左括号不匹配的这种情况),那么就返回false

2.遍历操作完成后,return stack.isEmpty()  (如果为空,那么说明左括号都有一一对应的右括号存在,就返回true,因为右括号匹配到对应的左括号那么就会进行把对应的左括号删除的操作。要是有剩的左括号存在,说明左右不匹配)

中等题

盛最多水的容器 

题目描述:

测试结果:

 具体代码:

import static java.lang.StrictMath.max;
import static java.lang.StrictMath.min;
class Solution {
      public int maxArea(int[] height){
       int maxarea=0;
       int s=0;int e=height.length-1;
       if(height.length==2){
           return min(height[0],height[1]);
       }
       while (s<e){
           int area=min(height[s],height[e])*(e-s);
           maxarea=max(maxarea,area);//每计算一次就将计算出来的area与现存的maxarea比较一次,选出较大者
           if(height[s]<=height[e]){
               s++;
           }
           else{
               e--;
           }
       }
       return maxarea;
   }
       public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String str=sc.nextLine().toString();//输入数组的内容,可以读取一整行,包括空格
        str=str.replaceFirst("\\[","");
        str=str.replaceFirst("\\]","");
        String arr[]=str.split(",");//拆分字符串成字符串数组
        int []aw=new int [arr.length];//定义一个长度和arr数组相同的int型的数组
        for(int i=0;i<aw.length;i++){
            aw[i]=Integer.parseInt(arr[i]);//将arr的内容复制到aw中
        }
        Solution s1=new Solution();
        System.out.println(s1.maxArea(aw));
    }
}

具体思路:

本题利用了双指针

1.当数组的元素只有两个时,直接返回最小的那个元素值乘以1

2.当数组元素 有两个以上时,我们就利用指针进行运算

2.1头指针指向第一个元素,尾指针指向末尾的元素,计算这两个元素的容量area,再用max方法把这个area与maxArea进行比较,找出较大者。

2.2然后比较头指针指向的元素与尾指针指向的元素的大小,如果头指针指向的元素小那么这个指针就往后移动,否则尾指针往前移动一个元素。因为area=两个指针指向的元素中的较小者*两个元素之间的距离,由于距离是在减小的,所以更大值只能让较小的元素替换成更大的元素才能找到。

3.返回maxArea

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笃岩_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值