LeetCode之路1,句子反转,逆波兰表达式,和平面找线

最近发现大神们很多都在混LeatCode

这个网站集合了很多的面试上的算法题,支持c++,java,和python,

很多问题想起来很简单,但是做起来很麻烦..而且会有很多的问题没想到

提交之后被他的测试用例一测试就原型闭路了,我尽量以一天一道道两道

题的速度来做,写这个系列的目的一是总结,一是督促。

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.

第一题,句子反转,不算难

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函数,去掉开头和结尾的空格
        while(s.startsWith(" ")){
            s = s.substring(1, s.length());
        }
        while(s.endsWith(" ")){
            s = s.substring(0, s.length()-1);
        }
        
        if (!s.contains(" "))
            return s;
        
        //正则表达式,消掉多个空格
        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 ");
//    }
}

第二题 给定一个逆波兰表达式,求该表达式的值

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

还算简单,仔细一看,就是栈的应用了...直接上代码

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.

给一个平面上的点,找到所有这些点落在哪条线上的点最多,并返回这个最大值

这个题....让我发现了太多逻辑上的漏洞,比如说数学上点,多个点重合算一个点

但是,如果用这样的方式给点的话,重合的点是要算两个的

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 可能有重复的点
     * 第一步,如果给的是空的数组,返回0 
     * 如果给的是只有一个点的数组,返回1 
     * 至少给了两个点的情况下 
     * 判断是否有不同的点,如果没有返回points.length
     * 用两个不同的点算出直线方程,之后再由函数getPointNumber算出points中
         * 有多少个点在该直线上,并计算所有这样的直线,找到最大值
     */

按照这个思路,代码不会特别难...但我写了好长时间才写对!

问题就是出在前面提到的想当然和各种逻辑错误。。。

下面的法一,发现要判断重复点的情况太麻烦了,于是砍掉重练...

下面贴代码

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个二维平面上的点,求出这n个点当中最多有多少个点在同一直线上。
 */


public class Solution {
    /*
     * 法一 ,这样的想法就是错误的
     */
//    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 可能有重复的点
     * 第一步,如果给的是空的数组,返回0
     * 如果给的是只有一个点的数组,返回1
     * 至少给了两个点
     * 判断是否有不同的点,如果没有返回points.length
     * 用两个不同的点算出直线方程,之后再由函数getPointNumber算出points中有多少个点在该
     * 直线上,并计算所有这样的直线,找到最大值
     */
    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);
        
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容