面试经典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);
    }
}

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

你可能感兴趣的:(面试经典,150,题,面试,算法,职场和发展)