目录
罗马转整数
方法一:使用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));
}
}
测试结果:
具体思路:
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
romanToIntMap=initialMap();//创建map int result=0; for(int i=0;i
题目描述:
具体代码:
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
测试结果:
具体思路:
题目描述:
测试结果:
具体代码:
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,因为右括号匹配到对应的左括号那么就会进行把对应的左括号删除的操作。要是有剩的左括号存在,说明左右不匹配)
题目描述:
测试结果:
具体代码:
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