LeetCode之路1浙于,句子反轉(zhuǎn),逆波蘭表達(dá)式挟纱,和平面找線

最近發(fā)現(xiàn)大神們很多都在混LeatCode

這個(gè)網(wǎng)站集合了很多的面試上的算法題羞酗,支持c++,java紊服,和python檀轨,

很多問題想起來很簡(jiǎn)單,但是做起來很麻煩..而且會(huì)有很多的問題沒想到

提交之后被他的測(cè)試用例一測(cè)試就原型閉路了欺嗤,我盡量以一天一道道兩道

題的速度來做参萄,寫這個(gè)系列的目的一是總結(jié),一是督促煎饼。

Reverse Words in a String

Given an input string, reverse the string word by word.

For example,
Given s = "the sky is blue",
return "blue is sky the".
click to show clarification.

第一題讹挎,句子反轉(zhuǎn),不算難

package everse.Words;
import java.util.ArrayList;

public class Solution {
    
    public Solution(String s){
        System.out.print(reverseWords(s));
    }
    
    public String reverseWords(String s) {
        if( s.equals(""))
            return s;
        
        //為了使用用split函數(shù)吆玖,去掉開頭和結(jié)尾的空格
        while(s.startsWith(" ")){
            s = s.substring(1, s.length());
        }
        while(s.endsWith(" ")){
            s = s.substring(0, s.length()-1);
        }
        
        if (!s.contains(" "))
            return s;
        
        //正則表達(dá)式筒溃,消掉多個(gè)空格
        String[] st = s.split("\\s{1,}");
        ArrayList<String> list = new ArrayList<String>();
        int i = st.length - 1;
        for(; i>=0 ; i--){
            list.add(st[i]);
        }
        
        String result = list.toString();
        result = result.substring(1, result.length()-1);
        result=result.replaceAll(", "," ");
        return result;
        
    }
    
//    public static void main(String[] args){
//      Solution test = new Solution("   a   b ");
//    }
}

第二題 給定一個(gè)逆波蘭表達(dá)式,求該表達(dá)式的值

Evaluate the value of an arithmetic expression in Reverse Polish Notation.

Valid operators are +, -, *, /. Each operand may be an integer or another expression.

Some examples:

  ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

還算簡(jiǎn)單沾乘,仔細(xì)一看怜奖,就是棧的應(yīng)用了...直接上代碼

package Evaluate.Reverse.Polish.Notation;

import java.util.Stack;

public class Solution {

    public int evalRPN(String[] tokens) {
        Integer xx ,yy,r;
        Stack<String> store = new Stack<String>();
        for(int i = 0; i < tokens.length; i++ ){
            if(Character.isDigit(tokens[i].charAt(tokens[i].length() - 1)))
                store.push(tokens[i]);
            else{
                switch (tokens[i]) {
                case "+":
                    xx = Integer.parseInt(store.pop());
                    yy = Integer.parseInt(store.pop());
                    r = xx + yy;
                    store.push(r.toString());
                    break;
                case "-":
                    xx = Integer.parseInt(store.pop());
                    yy = Integer.parseInt(store.pop());
                    r = yy-xx;
                    store.push(r.toString());
                    break;
                case "*":
                    xx = Integer.parseInt(store.pop());
                    yy = Integer.parseInt(store.pop());
                    r = xx * yy;
                    store.push(r.toString());
                    break;
                case "/":
                    xx = Integer.parseInt(store.pop());
                    yy = Integer.parseInt(store.pop());
                    r = yy/xx;
                    store.push(r.toString());
                    break;
                default:
                    break;
                }
            }
        }
        
        return Integer.parseInt(store.pop());
    
    }
    
    
//  public Solution(String[] s){
//      System.out.print(evalRPN(s));
//  }
//  
//  
//  public static void main(String[] args){
//      String[] s = {"3","-4","+"};
//      Solution test = new Solution(s);
//  }
}

平面找線

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

給一個(gè)平面上的點(diǎn),找到所有這些點(diǎn)落在哪條線上的點(diǎn)最多意鲸,并返回這個(gè)最大值

這個(gè)題....讓我發(fā)現(xiàn)了太多邏輯上的漏洞烦周,比如說數(shù)學(xué)上點(diǎn),多個(gè)點(diǎn)重合算一個(gè)點(diǎn)

但是怎顾,如果用這樣的方式給點(diǎn)的話读慎,重合的點(diǎn)是要算兩個(gè)的

class Point {
    Integer x;
    Integer y;
    public Point() {
        x = 0; y = 0;
    }
    public Point(int a, int b) { 
        x = a; y = b; 
    }
}

Point[] points

先說下我的思路

    /*
     * 思路,給的points 可能有重復(fù)的點(diǎn)
     * 第一步槐雾,如果給的是空的數(shù)組夭委,返回0 
     * 如果給的是只有一個(gè)點(diǎn)的數(shù)組,返回1 
     * 至少給了兩個(gè)點(diǎn)的情況下 
     * 判斷是否有不同的點(diǎn)募强,如果沒有返回points.length
     * 用兩個(gè)不同的點(diǎn)算出直線方程,之后再由函數(shù)getPointNumber算出points中
         * 有多少個(gè)點(diǎn)在該直線上株灸,并計(jì)算所有這樣的直線,找到最大值
     */

按照這個(gè)思路擎值,代碼不會(huì)特別難...但我寫了好長時(shí)間才寫對(duì)慌烧!

問題就是出在前面提到的想當(dāng)然和各種邏輯錯(cuò)誤。鸠儿。屹蚊。

下面的法一厕氨,發(fā)現(xiàn)要判斷重復(fù)點(diǎn)的情況太麻煩了,于是砍掉重練...

下面貼代碼

package Max.Points.Line;

class Point {
    Integer x;
    Integer y;
    public Point() {
        x = 0; y = 0;
    }
    public Point(int a, int b) { 
        x = a; y = b; 
    }
}

/*
 * Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
 * 給定n個(gè)二維平面上的點(diǎn)汹粤,求出這n個(gè)點(diǎn)當(dāng)中最多有多少個(gè)點(diǎn)在同一直線上命斧。
 */


public class Solution {
    /*
     * 法一 ,這樣的想法就是錯(cuò)誤的
     */
//    public int maxPoints(Point[] points) {
//      if(points.length == 0)
//          return 0;
//      if(points.length == 1)
//          return 1;
//      
//      HashMap<Double , Integer> store = new HashMap<Double, Integer>();
//      Integer count = 0;
//      Integer repeatPoint = 0;
//      Double temp;
//      Iterator iter;
//      
//      for(int i = 0; i < points.length; i++){
//          for(int j = 0; j < points.length; j++){
//              if(i == j)
//                  continue; 
//              repeatPoint = 0;
//              if (points[i].equals(points[j])){
//                  repeatPoint ++;
//                  continue;
//              }
//              temp = slope(points[i], points[j]);
//              if(store.containsKey(temp))
//                  store.put(temp, store.get(temp) +1 );
//              else
//                  store.put(temp, 2 );
//          }
//          iter = store.entrySet().iterator();
//          count += repeatPoint;
//          while(iter.hasNext()){
//              Map.Entry entry = (Map.Entry) iter.next();
//              if ((Integer) entry.getValue() >= count){
//                  count = (Integer) entry.getValue();
//              }
//          }
//          
//          store.clear();
//          
//      }
//        return count;
//    }
    
    
    /*
     * 思路嘱兼,給的points 可能有重復(fù)的點(diǎn)
     * 第一步国葬,如果給的是空的數(shù)組,返回0
     * 如果給的是只有一個(gè)點(diǎn)的數(shù)組芹壕,返回1
     * 至少給了兩個(gè)點(diǎn)
     * 判斷是否有不同的點(diǎn)汇四,如果沒有返回points.length
     * 用兩個(gè)不同的點(diǎn)算出直線方程,之后再由函數(shù)getPointNumber算出points中有多少個(gè)點(diǎn)在該
     * 直線上,并計(jì)算所有這樣的直線哪雕,找到最大值
     */
    public int maxPoints(Point[] points) {
        if(points.length == 0)
            return 0;
        if(points.length == 1)
            return 1;
        
        Integer repeatNum = 0;
        for(Point p : points){
            if(p.equals(points[0]))
                repeatNum ++;
        }
        if(repeatNum == points.length)
            return points.length;
        
        Integer maxCount = 0;
        Integer temp = 0;
        
    
        for(int i = 0; i < points.length ; i ++){
            for(int j = 0; j < points.length ; j ++){
                if(points[i] == points[j])
                    continue;
                temp = getPointNumber(points, points[i], points[j]);
                if(temp > maxCount)
                    maxCount = temp;
            }
        }           
        return maxCount ;
    }
    

    public Integer getPointNumber(Point[] points, Point p1, Point p2){      
        Integer count = 0;
        //直線若垂直
        if(p1.x == p2.x){
            for(Point p : points){
                if(p.x == p1.x){
                    count ++ ;
                }
            }
            return count;
        }
        //直線s水平
        if(p1.y == p2.y){
            for(Point p : points){
                if(p.y == p1.y){
                    count ++ ;
                }
            }
            return count;
        }
        
        //直線傾斜
        for(Point p :points){
            if((double)(p.y - p2.y)/(p1.y - p2.y) == (double)(p.x - p2.x)/(p1.x - p2.x) ){
                count ++ ;
            }
        }
        return count;
        
    }    
    
    public Solution(Point[] s){
        System.out.print(maxPoints(s));
    }
    public static void main(String[] atgs){
        Point[] s1 = {new Point(1,1), new Point(1,1), new Point(2,2),new Point(2,2)};
        Point[] s2 = {new Point(0,0), new Point(1,1), new Point(1,-1)};
        Point[] s3 = {new Point(3,1), new Point(12,3), new Point(3,1),new Point(-6,-1)};
        Point[] s4 = {new Point(-4,1), new Point(-7,7), new Point(-1,5),new Point(9,-25)};
        Solution test = new Solution(s4);
        
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末船殉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斯嚎,更是在濱河造成了極大的恐慌利虫,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堡僻,死亡現(xiàn)場(chǎng)離奇詭異糠惫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钉疫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門硼讽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牲阁,你說我怎么就攤上這事固阁。” “怎么了城菊?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵备燃,是天一觀的道長。 經(jīng)常有香客問我凌唬,道長并齐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任客税,我火速辦了婚禮况褪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘更耻。我一直安慰自己测垛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布秧均。 她就那樣靜靜地躺著赐纱,像睡著了一般脊奋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疙描,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音讶隐,去河邊找鬼起胰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巫延,可吹牛的內(nèi)容都是我干的效五。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼炉峰,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼畏妖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疼阔,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤戒劫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后婆廊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迅细,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年淘邻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茵典。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宾舅,死狀恐怖统阿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情筹我,我是刑警寧澤扶平,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站崎溃,受9級(jí)特大地震影響蜻直,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袁串,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一概而、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧囱修,春花似錦赎瑰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽压储。三九已至,卻和暖如春源譬,著一層夾襖步出監(jiān)牢的瞬間集惋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工踩娘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刮刑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓养渴,卻偏偏與公主長得像雷绢,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子理卑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容