面试经典150题(15-19)

leetcode 150道题 计划花两个月时候刷完,今天(第七天)完成了5道(15-19)150:

今天这些都是我之前做过的,还有就是今天的全都是模拟过程。。所以做的还算快。

15(13. 罗马数字转整数)

题目描述:

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 49。
X 可以放在 L (50) 和 C (100) 的左边,来表示 4090。 
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400900。
给定一个罗马数字,将其转换成整数。

第一版(直接模拟过程了,没有啥算法,没有啥技术含量。。想不出来更好的)

class Solution {
   
    public int romanToInt(String s) {
   
        int len=s.length();
        int index=0;
        int sum=0;
        while(index<len){
   
            if(s.charAt(index)=='I'){
   
                if(index+1<len&&s.charAt(index+1)=='V'){
   
                    sum+=4;
                    index++;
                }  
                else if(index+1<len&&s.charAt(index+1)=='X'){
   
                    sum+=9;
                    index++;
                }else{
   
                    sum+=1;
                }     
            }else if(s.charAt(index)=='X'){
   
                 if(index+1<len&&s.charAt(index+1)=='L'){
   
                    sum+=40;
                    index++;
                }  
                else if(index+1<len&&s.charAt(index+1)=='C'){
   
                    sum+=90;
                    index++;
                }else{
   
                    sum+=10;
                }     
            }
            else if(s.charAt(index)=='C'){
   
                 if(index+1<len&&s.charAt(index+1)=='D'){
   
                    sum+=400;
                    index++;
                }  
                else if(index+1<len&&s.charAt(index+1)=='M'){
   
                    sum+=900;
                    index++;
                }else{
   
                    sum+=100;
                } 
            }else if(s.charAt(index)=='V'){
   
                sum+=5;
            }else if(s.charAt(index)=='L'){
   
                sum+=50;
            }else if(s.charAt(index)=='D'){
   
                sum+=500;
            }else if(s.charAt(index)=='M'){
   
                sum+=1000;
            }
            index++;
        }
        return sum;
    }
}

16 (12. 整数转罗马数字)

题目描述:
和上面这个一样 这个是数字转罗马数字:数字范围为:
1 <= num <= 3999
第一版:(还是模拟过程反着来,但是这个是leetcode中等题。。上面的是简单题)

class Solution {
   
    public String intToRoman(int num) {
   
        StringBuilder sb=new StringBuilder();
        while(num!=0){
   
            if(num>=1000){
   
                int qNum=num/1000;
                for(int i=0;i<qNum;i++){
   
                    sb.append("M");
                }
                num%=1000;
            }else if(num>=100){
   
                int bNum=num/100;
                if(bNum==9){
   
                    sb.append("CM");
                    bNum-=9;
                }
                if(bNum>=5){
   
                    sb.append("D");
                    bNum-=5;
                }
                if(bNum==4){
   
                    sb.append("CD");
                    bNum-=4;
                }
                for(int i=0;i<bNum;i++){
   
                    sb.append("C");
                }
                num%=100;
            }else if(num>=10){
   
                int sNum=num/10;
                if(sNum==9){
   
                    sb.append("XC");
                    sNum-=9;
                }
                if(sNum>=5){
   
                    sb.append("L");
                    sNum-=5;
                }
                if(sNum==4){
   
                    sb.append("XL");
                    sNum-=4;
                }
                for(int i=0;i<sNum;i++){
   
                    sb.append("X");
                }
                num%=10;
            }else if(num>=1){
   
                if(num==9){
   
                    sb.append("IX");
                    num-=9;
                }
                if(num>=5){
   
                    sb.append("V");
                    num-=5;
                }
                if(num==4){
   
                    sb.append("IV");
                    num-=4;
                }
                for(int i=0;i<num;i++){
   
                    sb.append("I");
                }
                break;
            }
        }
        return sb.toString();
    }
}

17 (58. 最后一个单词的长度)

题目描述:

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

第一版(这题我一看,很快,很快啊 直接 split 然后return 哈哈哈,但是一看解题意思要自己写。。)

class Solution {
   
    public int lengthOfLastWord(String s) {
   
        String[] strs=s.trim().split(" ");
        return strs[strs.length-1].length();
    }
}

第二版(算是自己写版,其实没必要都有接口了直接用多好,希望笔试时候出题人也能这样想。。)

class Solution {
   
    public int lengthOfLastWord(String s) {
   
        char[] chars=s.toCharArray();
        int index=chars.length-1;
        int len=0;
        while(index>=0){
   
            if(chars[index]!=' '){
   
                break;
            }
            index--;
        }
        while(index>=0){
   
            if(chars[index--]!=' '){
   
                len++;
            }else{
   
                break;
            }
        }
        return len;
    }
}

18 (14. 最长公共前缀)

题目描述:

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""

这个题我知道有个横向和纵向的,但是每次想不到横向的。。。
第一版(纵向的也是好想到的)

class Solution {
   
    public String longestCommonPrefix(String[] strs) {
   
        if(strs.length<=1){
   
            return strs[0];
        }
        for(int i=0;i<strs[0].length();i++){
   
            char temp=strs[0].charAt(i);
            for(int j=1;j<strs.length;j++){
   
                if(i==strs[j].length()||strs[j].charAt(i)!=temp){
   
                    return strs[0].substring(0,i);
                }
            }
        }
        return strs[0];
    }
}

第二版(横向的,我感觉有种逆思维的感觉,不是每次能想出来,他是用其中一个去和剩下的求最长公共序列,然后再用求出来公共序列再去和剩下的求,想法很好但不是很好想)

class Solution {
   
    public String longestCommonPrefix(String[] strs) {
   
        // 在写一下横向的 每次都想不起来横向的
        if(strs==null||strs.length<=0){
   
            return "";
        }
        int count=strs.length;
        if(count==1){
   
            return strs[0];
        }
        String preString=strs[0];
        for(int i=1;i<count;i++){
   
            preString=commonPrefix(preString,strs[i]);
            if(preString.length()==0){
   
                return preString;
            }
        }
        return preString;
        
    }
    public String commonPrefix(String str1,String str2) {
   

        int len1=str1.length();
        int len2=str2.length();
        int index=0;
        while(index<len1&&index<len2
        &&str1.charAt(index)==str2.charAt(index)){
   
            index++;
        }
        return str1.substring(0,index);
    }
}

19 (151. 反转字符串中的单词)题目描述:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

第一版(这个题也有种让自己去实现已经有的api,我只写了一版,没有写自己实现的api…感觉太麻烦了有就用就行了。。)

class Solution {
   
    public String reverseWords(String s) {
   
        String[] strs=s.trim().split(" ");
        int len=strs.length;
        List<String> temp=new ArrayList();
        for(int i=len-1;i>=0;i--){
   
            if(!"".equals(strs[i])){
   
                temp.add(strs[i]);
            }
        }
        // 这个方法真的用的时候很多。。
        return String.join(" ",temp);
    }
}

加油早点跳槽!!今天就是把之前写过的回顾了一边,还行简单的没忘。。哦,我没有写困难的题目。。
早日跳槽!!

相关推荐

  1. 面试经典150(15-19)

    2023-12-14 13:22:02       57 阅读
  2. 面试经典150(10-13)

    2023-12-14 13:22:02       57 阅读
  3. 面试经典150(14)

    2023-12-14 13:22:02       62 阅读
  4. 【leetcode面试经典15010.跳跃游戏 II(C++)

    2023-12-14 13:22:02       41 阅读
  5. 面试经典---15.三数之和

    2023-12-14 13:22:02       53 阅读
  6. 面试经典 150

    2023-12-14 13:22:02       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-14 13:22:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-14 13:22:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-14 13:22:02       82 阅读
  4. Python语言-面向对象

    2023-12-14 13:22:02       91 阅读

热门阅读

  1. k8s 环境中ipvs VS iptables

    2023-12-14 13:22:02       43 阅读
  2. 【自主探索】frontier_exploration 源码解析

    2023-12-14 13:22:02       62 阅读
  3. Golang 链表的创建和读取 小记

    2023-12-14 13:22:02       57 阅读
  4. 【Android】DeepLink

    2023-12-14 13:22:02       56 阅读
  5. 【工具类】Excel 多 Sheet 导入工具类

    2023-12-14 13:22:02       60 阅读
  6. multiprocessing --- 基于进程的并行

    2023-12-14 13:22:02       54 阅读