OJ-Problems-Source/LeetCode-CN/刷题.md

14 KiB
Raw Blame History

create by jzf@2018/06/20

[TOC]

作业

[TOC]

627. 交换工资 @2018/06/20

jzf :517ms

update salary 
    set sex = case when sex ='m' then 'f' else 'm' end;

kiritow:563ms

    update salary set sex = case sex
    when 'f' then 'm'
    when 'm' then 'f'
    end

3. 无重复字符的最长子串 @2018/06/20

北河

  • 第一版 :392ms
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        map<char, short> v;
        int max_num = 0;
        for (int i = 0; i < s.size(); ++i) {
            if (v.find(s[i]) != v.end()) {
                if (max_num < v.size()) {
                    max_num = v.size();
                }
                i = v.find(s[i])->second + 1;
                v.clear();
            }
            if (i >= s.size()) {
                break;
            }
            v[s[i]] = i;
            if (max_num < v.size()) {
                max_num = v.size();
            }
        }
        return max_num;
    }
};

  • 第2版 :32ms
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        map<char, short> v;
        int max_num = 0;
        for (int i = 0; i < s.size(); ++i) {
            if (v.find(s[i]) != v.end()) {
                if (max_num < v.size()) {
                    max_num = v.size();
                }
                ++i;
                while (i < s.size()) {
                    if (v.find(s[i]) != v.end()) {
                        ++i;
                        continue;
                    }
                    --i;
                    break;
                }
                if (i >= s.size()) {
                    return max_num;
                }
                i = v.find(s[i])->second + 1;
                v.clear();
            }
            if (i >= s.size()) {
                break;
            }
            v[s[i]] = i;
            if (max_num < v.size()) {
                max_num = v.size();
            }
        }
        return max_num;
    }
};

jzf :252 ms 8

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int num =1;
        int max =0;
        if(s.length()==1)
        {
            return 1;
        }
        for(size_t i =0;i<s.length();i++)
        {
            
            for(size_t j=i+1;j<s.length();j++)
            {
                int flag =0;
                for(size_t k =i;k<j;k++)
                {
                    if(s[j]==s[k])   
                    {
                        flag =1;
                        break;
                    }
                    num++;
                }
                    if(num>max)
                    {
                        max =num;
                    }
                if(flag ==1)
                {
                    break;
                }
                num =1;
            }
             num =1;
        }
        return max;
    }
};

puck :544ms 2

#ifndef SOLUTION_H
#define SOLUTION_H

#include <algorithm>
#include <string>
#include <set>
using std::string;
class Solution
{
  public:
    int lengthOfLongestSubstring(string s)
    {
        int result{};
        for (std::size_t i{}; i < s.size(); ++i)
        {
            string tmp_str = s.substr(i);
            int cu_length{};
            std::set<char> set_except;
            
            for (auto ch : tmp_str)
            {
                if (set_except.end() == set_except.find(ch))
                {
                    set_except.insert(ch);
                    ++cu_length;
                }
                else
                {
                    break;
                }
            }

            result = std::max(result, cu_length);
        }

        return result;
    }
};

#endif

kiritow 24ms 2

#include <cstdlib>
#include <cstring>
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int sz = s.size();
        int bin[256];
        int maxlen = 0;
        int clen = 0;
        int L = 0;
        while (L < sz)
        {
            memset(bin, 0, sizeof(int) * 256);
            int i;
            for (i = L; i < sz; i++)
            {
                if (bin[s[i]])
                {
                    maxlen = clen > maxlen ? clen : maxlen;
                    clen = 0;
                    L++;
                    break;
                }
                else
                {
                    bin[s[i]] = 1;
                    clen++;
                }
            }
            if (i == sz)
            {
                maxlen = clen > maxlen ? clen : maxlen;
                break;
            }
        }
        return maxlen;
    }
};

知识点

桶排序
sync_with_stdio

总结

1, 对比代码发现,利用现有的数据结构,可以快速出活,而且代码简洁,逻辑清晰。

2, STL不好好用很慢。

494. 目标和 @2018/06/21

jzf

  • 第一版 超时 复杂度 n*2^n
class Solution {
public:  int findTargetSumWays(vector<int>& nums, int S) {
    int n = 0;
    int sum = 0;
    int b = 0;
    int size =nums.size();
    for (size_t k = 0; k <size ; k++)
    {
        b = ((1 << k) | b);
    }
    for (size_t i = 0; i <= b; i++)
    {
        n = 0;
        for (size_t j = 0; j < size; j++)
        {
            n += ((1 << j)&i) ? -nums[j] : nums[j];
        }
        if (n == S)
        {
            sum++;
        }
    }
    return sum;
    }
};
  • 第二版

kiritow 24ms 2

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
        if (S < -1000 || S>1000) return 0;

        int sz = nums.size();
        int msz = sizeof(int) * 2048;
        int _bin[2048] = { 0 };
        int _xbin[2048] = { 0 };
        int* p = _bin;
        int* q = _xbin;
        memset(p, 0, msz);
        p[1000] = 1;
        
        for (int i = 0; i < sz; i++)
        {
            memset(q, 0, msz);
            for (int j = 0; j < 2048; j++)
            {
                if (p[j])
                {
                    //printf("p[%d]=%d\n", p[j]);
                    // now=j-1000;
                    int L = j - nums[i]; // now-nums[i]+1000
                    int R = j + nums[i];
                    q[L] += p[j];
                    q[R] += p[j];
                    //printf("q[%d]=%d\n", L, q[L]);
                    //printf("q[%d]=%d\n", R, q[R]);
                }
            }
            std::swap(p, q);
        }
        return p[S + 1000];
    }
};

知识点

dfs

bfs

剪枝

记忆搜索

去掉重复

没写dp身败名裂--惠惠语录

601. 体育馆的人流量@2018/06/21

jzf :521ms 抄

    select s1.* 
    from stadium  as s1, stadium  as s2,stadium  as s3 
    where (((s2.id =s1.id+1) and (s3.id =s1.id+2))
           or((s2.id =s1.id-1) and (s3.id =s1.id+1))
           or((s2.id =s1.id-2) and (s3.id =s1.id-1)))
        and 
         (s1.people>=100 and s2.people>=100 and s3.people >=100)
    group by s1.id

知识点

mysql必知必会 16章 自连接

总结

1看了下最快的sql语句感叹逻辑差不过的东西差距真大呀

9. 回文数@2018/06/22

羽柔子 372ms

var isPalindrome = function(x) {
    return x.toString()===x.toString().split("").reverse().join("");
};
  • 第二版 128ms
class Solution {
int list[10],len=0,i=0;
public:
    bool isPalindrome(int x) {
        if(x<0)return false;
        len=i=0;
        //分解
        while(true){
            if(x>=10){
                list[len++]=x%10;
                x/=10;
            }
            else{
                list[len++]=x;
                break;
            }
        }

        //判断
        --len;
        for(i=0;i<len&&list[i]==list[len];i++,len--);
        return i>=len;
    }
};

jzf

  • 第一版 232ms
    class Solution {
    public:
        bool isPalindrome(int x) {
            int mod;
            int sh =x;
            vector<int> vec;
            if(x <0)
            {
                return false;
            }
            if(x ==0)
            {
                return true;
            }
    
            for(size_t i =0;sh>0;i++)
            {
                vec.push_back(sh%10);
                sh = sh/10;
            }
            vector<int>::iterator i=vec.begin();
            vector<int>::iterator j=vec.end()-1;
            for(;i<j;i++,j--)
            {
                if(*i!=*j)
                {
                    return false;
                }
            }
            return true;  
        }
    };
    
  • 第2版 140ms
class Solution {
public: bool isPalindrome(int x) {
       int mod;
       int sh =x;
       vector<int> vec;
       if(x <0)
       {
           return false;
       }
       if(x ==0)
       {
           return true;
       }
       if(x%10 ==0)
       {
           return false;
       }
       for(size_t i =0;sh>0;i++)
       {
           vec.push_back(sh%10);
           sh = sh/10;
       }
       vector<int>::iterator i=vec.begin();
       vector<int>::iterator j=vec.end()-1;
       for(;i<j;i++,j--)
       {
           if(*i!=*j)
           {
               return false;
           }
       }
       return true;  
   }
};

北河 244ms

  • 第一版
class Solution {
public:
    bool isPalindrome(int x) {
        char p[10], q[10];
        short size = sprintf(p, "%d", x);
        reverse_copy(p, p + size, q);
        return x < 0 ? false : (mismatch(p, p + size / 2 + 1, q).first == (p + size / 2 + 1) ? true : false);               
    }
};
  • 第二版
class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0) {
            return false;
        }
        string s = to_string(x);
        return mismatch(s.begin(), s.end(), s.rbegin()).first == s.end();
    }
};

kiritow 120ms

#include <cstdio>
class Solution {
public:
    bool isPalindrome(int x) {
        /*
        // Converting to string is too slow!!
        char buff[64] = { 0 };
        sprintf(buff, "%d", x);
        int len = strlen(buff);
        int L = 0, R = len - 1;
        while (L < R)
        {
            if (buff[L] != buff[R]) return false;
            ++L;
            --R;
        }
        return true;
        */
        if (x < 0) return false;
        int buff[64] = { 0 };
        int c = 0;
        int tx = x;
        while (tx > 0)
        {
            buff[c++] = tx % 10;
            tx /= 10;
        }
        int L = 0, R = c - 1;
        while (L < R)
        {
            if (buff[L] != buff[R]) return false;
            ++L;
            --R;
        }
        return true;
    }
};

puck

#include <string>

class Solution
{
  public:
    bool isPalindrome(int x)
    {
        if (x < 0)
            return false;

        std::string tmp = std::to_string(x);

        std::size_t bi_size = tmp.size() / 2;
        auto half = tmp.begin() + bi_size;
        auto iter = tmp.begin();
        auto riter = tmp.rbegin();
        for (; iter != half; ++iter, ++riter)
        {
            if (*iter != *riter)
                return false;
        }
        return true;
    }
};

总结

1 我在想一个问题 羽柔子撤回了一条消息 喵在想一个问题 --羽柔子语录

225. 用队列实现栈@2018/06/22

羽柔子 0ms

class MyStack {
    int stack[10],index=0;
    
public:
    /** Initialize your data structure here. */
    MyStack() {
    }
    
    /** Push element x onto stack. */
    void push(int x) {
        stack[index++]=x;
    }
    
    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        return stack[--index];
    }
    
    /** Get the top element. */
    int top() {
        return stack[index-1];
    }
    
    /** Returns whether the stack is empty. */
    bool empty() {
        return !index;
    }
};

28. 实现strStr() @2018/06/23

jzf

  • 第一版 4ms
class Solution {
public:
    int strStr(string haystack, string needle) {
        string::iterator ihay;
        string::iterator inee;
        int ni =haystack.size();
        int nn =needle.size();
        int ret = -1;
        
        if(nn==0)
        {
            return 0;
        }
        if(ni<nn)
        {
            return -1;
        }
        for(size_t i=0;i<ni-nn+1;i++)
        {
            if(!(haystack.substr(i,nn)).compare(needle))
            {
                ret =i;
                break;
            }
        }
        
        return ret;
    }
};

羽柔子

class Solution {
public:
    int strStr(string haystack, string needle) {
        if(needle.size()==0)return 0;
        if(haystack.size()<needle.size())return -1;
        size_t 
            i,j,
            ilen=haystack.size()-needle.size(),
            jlen=needle.size(); 
        for( i = 0; i <= ilen; i++){
            for( j = 0; j < jlen; j++)
                if(haystack[i+j]!=needle[j])
                    goto A;
            return i;
            A:;
        }
        return -1;
    }
};

puck

class Solution
{
  public:
    int strStr(string haystack, string needle)
    {
        std::size_t size_a{haystack.size()};
        std::size_t size_b{needle.size()};

        if (0 == size_b)
        {
            return 0;
        }

        bool flag{};

        for (int i{}; i < size_a; ++i)
        {
            if (haystack.at(i) == needle.at(0))
            {
                flag = true;

                for (int j{1}; j < size_b; ++j)
                {
                    if (i + j >= size_a || haystack.at(i + j) != needle.at(j))
                    {
                        flag = false;
                        break;
                    }
                }

                if (flag)
                {
                    return i;
                }
            }
        }

        return -1;
    }
};

北河

823. Binary Trees With Factors@2018/06/23

196. 删除重复的电子邮箱@2018/06/23

北河

delete from Person where id in (select c.id from (select a.id from Person a  join Person b on a.Email = b.Email and a.Id > b.Id) c);