zoukankan      html  css  js  c++  java
  • 算法学习笔记(LeetCode OJ)

    ==================================

    LeetCode的一些算法题,都是自己做的,欢迎提出改进~~

    LeetCode:http://oj.leetcode.com

    ==================================

    <Reverse Words in a String>-20140328

    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.
     1 public class Solution {
     2     public String reverseWords(String s) {
     3         s = s.trim();
     4         String[] str = s.split("\s{1,}");
     5         String tmp;
     6         int len = str.length;
     7         int halfLen = len/2;
     8         for(int i=0;i<halfLen;i++){
     9             tmp = str[i];
    10             str[i] = str[len-i-1];
    11             str[len-i-1] = tmp;
    12         }
    13         StringBuffer sb = new StringBuffer();
    14         String result;
    15         if(len==1){
    16             result = str[0];
    17         }else{
    18             for(String string:str){
    19                 sb.append(string+" ");
    20             }
    21             result = sb.toString().trim();
    22         }
    23         return result;
    24     }
    25 }
    Java Code - 404ms - AC1/7

     C++: http://blog.csdn.net/feliciafay/article/details/20884583

    一个空格的情况
    多个空格在一起的情况
    空串的情况
    首尾空格的情况
    一些测试数据:
    “            ”
    “a       ”
    "       a"
    "      a     "
    "     a      b    "
    "     a b     "
    "     a  b"
    "a  b       "
    Hint

     <Evaluate Reverse Polish Notation>-20140329

    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
     1 public class Solution {
     2     public int evalRPN(String[] tokens) {
     3         Stack<Integer> stack = new Stack();
     4         for(String str:tokens){
     5             if("+-*/".contains(str)){
     6                 int b = stack.pop();
     7                 int a = stack.pop();
     8                 switch(str){
     9                     case "+":
    10                         stack.add(a+b);
    11                         break;
    12                     case "-":
    13                         stack.add(a-b);
    14                         break;
    15                     case "*":
    16                         stack.add(a*b);
    17                         break;
    18                     case "/":
    19                         stack.add(a/b);
    20                         break;
    21                 }
    22             }else{
    23                 stack.add(Integer.parseInt(str));
    24             }
    25         }
    26         return stack.pop();
    27     }
    28 }
    Java Code - 484ms - AC1/1

     <Max Points on a Line>-20140330

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

    开始的实现:

     1 /**
     2  * Definition for a point.
     3  * class Point {
     4  *     int x;
     5  *     int y;
     6  *     Point() { x = 0; y = 0; }
     7  *     Point(int a, int b) { x = a; y = b; }
     8  * }
     9  */
    10 public class Solution {
    11     private boolean judgment(Point a, Point b, Point third){
    12         return (a.y-third.y)*(b.x-third.x)==(b.y-third.y)*(a.x-third.x);
    13     }
    14     
    15     public int maxPoints(Point[] points) {
    16         int len = points.length;
    17         if(len<3){
    18             return len;
    19         }
    20         int[] mark = new int[len];
    21         for(int m=0;m<len;m++){
    22             mark[m] = 0;
    23         }
    24         int count = 2;
    25         for(int i=0;i<len;i++){
    26             int tmpCount = 2;
    27             for(int j=i+1;j<len;j++){
    28                 if(mark[j]==1){
    29                     continue;
    30                 }
    31                 for(int k=j+1;k<len;k++){
    32                     if(mark[k]==1){
    33                         continue;
    34                     }
    35                     boolean judge = judgment(points[i],points[j],points[k]);
    36                     if(judge){
    37                         mark[k] = 1;
    38                         tmpCount++;
    39                     }
    40                 }
    41             }
    42             if(tmpCount>count){
    43                 count = tmpCount;
    44             }
    45         }
    46         return count;
    47     }
    48 }
    Java Code - Wrong

    后来发现被坑了,它是有相同点出现这种情况的!!!开始我还傻傻地想为什么<5,6,18>三点共线而<0,5,6>却不共线,后来自己费了好大力气才明白过来。

    然后,还有其他的问题,对此题无力了,还是先放放过几天头脑清醒再来弄吧T-T。

    看看人家的思想先吧,不过我还是想先自己搞掂再看。

    C++: http://blog.csdn.net/feliciafay/article/details/20704629

    <Single Number>-20140414

    Given an array of integers, every element appears twice except for one. Find that single one.
    
    Note:
    Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
    1 public class Solution {
    2     public int singleNumber(int[] A) {
    3         int num = 0;
    4         for(int i : A){
    5             num ^= i;
    6         }
    7         return num;
    8     }
    9 }
    Java Code
  • 相关阅读:
    1722 最优乘车 1997年NOI全国竞赛
    tarjan算法详解
    codevs 原创抄袭题 5969 [AK]刻录光盘
    Kosaraju算法详解
    1722 最优乘车 未完成
    codevs原创抄袭题 5960 信使
    1405 奶牛的旅行
    android 管理Bitmap内存
    Dynamics CRM 2013 初体验(3):新增加的功能
    在android画面切换时设置跟随变动的小圆圈
  • 原文地址:https://www.cnblogs.com/xzhang/p/3631389.html
Copyright © 2011-2022 走看看