力扣(二)

目录

罗马转整数

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

方法一的改进版本 

最长公共前缀

 有效的括号


简单题

罗马转整数

题目描述

力扣(二)_第1张图片

 方法一:使用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 romanToIntMap=initialMap();//创建map
        int result=0;
        for(int i=0;i initialMap(){
        Map 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));
    }
}

测试结果:

力扣(二)_第2张图片

 具体思路:

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张图片

 具体改动的地方在此步骤

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 romanToIntMap=initialMap();//创建map
        int result=0;
        for(int i=0;i

最长公共前缀

题目描述:

力扣(二)_第4张图片

 具体代码:

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

测试结果: 

力扣(二)_第5张图片

 具体思路:

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

力扣(二)_第6张图片

力扣(二)_第7张图片

 有效的括号

 题目描述:

力扣(二)_第8张图片

 力扣(二)_第9张图片

 力扣(二)_第10张图片

 测试结果:

力扣(二)_第11张图片

 具体代码:

class Solution {
    public boolean isValid(String s) {
    
        Stack 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,因为右括号匹配到对应的左括号那么就会进行把对应的左括号删除的操作。要是有剩的左括号存在,说明左右不匹配)

中等题

盛最多水的容器 

题目描述:

力扣(二)_第12张图片

测试结果:

力扣(二)_第13张图片

 具体代码:

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

具体思路:

本题利用了双指针

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

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

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

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

3.返回maxArea

你可能感兴趣的:(java,算法)