Hard模式题目
先过一下Hard模式的题目吧。
| # | Title | Editorial | Acceptance | Difficulty | Frequency | |
|---|---|---|---|---|---|---|
| 。 | 65 | 12.6% | Hard | |||
| 。 | 126 | 13.6% | Hard | |||
| 。 | 149 | 15.6% | Hard | |||
| 。 | 146 | 16.0% | Hard | |||
| 。 | 68 | 18.1% | Hard | |||
| 。 | 460 | 19.0% | Hard | |||
| 。 | 44 | 19.0% | Hard | |||
| 。 | 308 | 19.8% | Hard | |||
| 。 | 4 | 20.8% | Hard | |||
| 。 | 420 | 21.0% | Hard | |||
| 。 | 273 | 21.1% | Hard | |||
| 。 | 30 | 21.7% | Hard | |||
| 。 | 440 | 22.1% | Hard | |||
| 。 | 140 | 22.2% | Hard | |||
| 。 | 212 | 22.2% | Hard | |||
| 。 | 269 | 22.3% | Hard | |||
| 。 | 174 | 22.9% | Hard | |||
| 。 | 214 | 23.0% | Hard | |||
| 446 | 23.0% | Hard | ||||
| 32 | 23.1% | Hard | ||||
| 295 | 23.3% | Hard | ||||
| 132 | 23.4% | Hard | ||||
| 10 | 23.6% | Hard | ||||
| 76 | 23.8% | Hard | ||||
| 188 | 23.8% | Hard | ||||
| 321 | 23.9% | Hard | ||||
| 135 | 23.9% | Hard | ||||
| 335 | 23.9% | Hard | ||||
| 97 | 23.9% | Hard | ||||
| 391 | 24.2% | Hard | ||||
| 158 | 24.4% | Hard | ||||
| 466 | 24.6% | Hard | ||||
| 336 | 24.7% | Hard | ||||
| 41 | 24.9% | Hard | ||||
| 124 | 25.0% | Hard | ||||
| 224 | 25.5% | Hard | ||||
| 218 | 25.5% | Hard | ||||
| 84 | 25.6% | Hard | ||||
| 23 | 25.9% | Hard | ||||
| 45 | 26.0% | Hard | ||||
| 85 | 26.1% | Hard | ||||
| 57 | 26.3% | Hard | ||||
| 138 | 26.6% | Hard | ||||
| 233 | 27.3% | Hard | ||||
| 381 | 28.0% | Hard | ||||
| 37 | 28.1% | Hard | ||||
| 432 | 28.2% | Hard | ||||
| 87 | 28.3% | Hard | ||||
| 123 | 28.3% | Hard | ||||
| 56 | 28.4% | Hard | ||||
| 282 | 28.5% | Hard | ||||
| 316 | 28.6% | Hard | ||||
| 164 | 28.6% | Hard | ||||
| 99 | 28.7% | Hard | ||||
| 327 | 28.9% | Hard | ||||
| 51 | 29.0% | Hard | ||||
| 25 | 29.7% | Hard | ||||
| 472 | 30.1% | Hard | ||||
| 465 | 30.1% | Hard | ||||
| 248 | 30.5% | Hard | ||||
| 72 | 30.6% | Hard | ||||
| 115 | 30.6% | Hard | ||||
| 403 | 30.9% | Hard | ||||
| 411 | 31.1% | Hard | ||||
| 239 | 31.4% | Hard | ||||
| 330 | 31.5% | Hard | ||||
| 297 | 31.6% | Hard | ||||
| 354 | 31.8% | Hard | ||||
| 358 | 31.8% | Hard | ||||
| 33 | 31.9% | Hard | ||||
| 363 | 32.1% | Hard | ||||
| 410 | 32.2% | Hard | ||||
| 480 | 33.1% | Hard | ||||
| 317 | 33.3% | Hard | ||||
| 117 | 33.5% | Hard | ||||
| 315 | 33.5% | Hard | ||||
| 301 | 34.5% | Hard | ||||
| 42 | 35.3% | Hard | ||||
| 128 | 35.3% | Hard | ||||
| 329 | 35.4% | Hard | ||||
| 407 | 35.6% | Hard | ||||
| 154 | 36.2% | Hard | ||||
| 265 | 37.1% | Hard | ||||
| 272 | 37.6% | Hard | ||||
| 291 | 37.7% | Hard | ||||
| 305 | 38.1% | Hard | ||||
| 380 | 38.4% | Hard | ||||
| 145 | 38.4% | Hard | ||||
| 340 | 38.6% | Hard | ||||
| 352 | 38.9% | Hard | ||||
| 159 | 39.7% | Hard | ||||
| 312 | 41.6% | Hard | ||||
| 287 | 41.8% | Hard | ||||
| 425 | 41.9% | Hard | ||||
| 52 | 42.8% | Hard | ||||
| 302 | 44.0% | Hard | ||||
| 471 | 44.2% | Hard | ||||
| 296 | 50.4% | Hard |
| 65 | Valid Number | 12.6% | Hard |
好像很繁琐。
| 126 | Word Ladder II | 13.6% | Hard |
方法是很好的。不是采用查找备选集的方式,而是采用逐个字符替换(可以加Hash来查找),这样复杂度从很高,降低到O(26*n), n是字典长度。
| 149 | Max Points on a Line | 15.6% | Hard |
解法很好。通过角度来判断是否一条直线。我看了解法之后,觉得可以再优化一下,比如记下后续点已经处理过的角度。
| 146 | LRU Cache | 16.0% | Hard |
我觉得用一个Hash, 加一个双向链表比较好。Hash里面记录链表实际节点,然后每次访问,这个节点移到双向链表的头部,成为新的head。每次满了删除,就删除尾部的。
里面还用了stl的list实现里面的一种很快的方式(当然了,自己来移动节点,也行):
// 貌似用这个splice比较快
dl.splice(dl.begin(), dl, mitr->second);
| 68 | Text Justification | 18.1% | Hard |
这道题目主要的难点就是gap的处理,尤其是gap不一致的情况。用的是下面的方法:
if (i < extra) {
line.push_back(' ');
}
也就是说,对于前面"extra"个数的间隔,都加上一个。
| 460 | LFU Cache | 19.0% | Hard |
很好,非常好!用了一个抽象数据结构Node,来记录同一访问频次层级的key,然后用了LinkedHashSet来记录这些key,进一步保证了先来后到(先达到的,会先删除)。好好领悟,很好!
还用了两个HashMap,分别记录真实的结果,以及一个key对应的Node(如上所述,这个Node里面包含了很多key,用LinkedHashSet来组织的)
| 44 | Wildcard Matching | 19.0% | Hard |
下面这个真是写的非常非常好:
C++版本的:
bool isMatch(const char *s, const char *p) {
const char* star=NULL;
const char* ss=s;
while (*s){
//advancing both pointers when (both characters match) or ('?' found in pattern)
//note that *p will not advance beyond its length
if ((*p=='?')||(*p==*s)){s++;p++;continue;}
// * found in pattern, track index of *, only advancing pattern pointer
if (*p=='*'){star=p++; ss=s;continue;}
//current characters didn't match, last pattern pointer was *, current pattern pointer is not *
//only advancing pattern pointer
if (star){ p = star+; s=++ss;continue;}
//current pattern pointer is not star, last patter pointer was not *
//characters do not match
return false;
}
//check for remaining characters in pattern
while (*p=='*'){p++;}
return !*p;
}
Java版本的:
boolean comparison(String str, String pattern) {
int s = 0, p = 0, match = 0, starIdx = -1;
while (s < str.length()){
// advancing both pointers
if (p < pattern.length() && (pattern.charAt(p) == '?' || str.charAt(s) == pattern.charAt(p))){
s++;
p++;
}
// * found, only advancing pattern pointer
else if (p < pattern.length() && pattern.charAt(p) == '*'){
starIdx = p;
match = s;
p++;
}
// last pattern pointer was *, advancing string pointer
else if (starIdx != -1){
p = starIdx + 1;
match++;
s = match;
}
//current pattern pointer is not star, last patter pointer was not *
//characters do not match
else return false;
}
//check for remaining characters in pattern
while (p < pattern.length() && pattern.charAt(p) == '*')
p++;
return p == pattern.length();
}
| 4 | Median of Two Sorted Arrays | 20.8% | Hard |
下面这个解法真的是太棒了!讲解也讲的很好。基本就是分成两部分,使得右边的始终>=左边的,然后求出左边的max 与 右边的min,然后取中,就可以啦!
真的是太好了!
def median(A, B):
m, n = len(A), len(B)
if m > n:
A, B, m, n = B, A, n, m
if n == 0:
raise ValueError imin, imax, half_len = 0, m, (m + n + 1) / 2
while imin <= imax:
i = (imin + imax) / 2
j = half_len - i
if i < m and B[j-1] > A[i]:
# i is too small, must increase it
imin = i + 1
elif i > 0 and A[i-1] > B[j]:
# i is too big, must decrease it
imax = i - 1
else:
# i is perfect if i == 0: max_of_left = B[j-1]
elif j == 0: max_of_left = A[i-1]
else: max_of_left = max(A[i-1], B[j-1]) if (m + n) % 2 == 1:
return max_of_left if i == m: min_of_right = B[j]
elif j == n: min_of_right = A[i]
else: min_of_right = min(A[i], B[j]) return (max_of_left + min_of_right) / 2.0
| 420 | Strong Password Checker | 21.0% | Hard |
太繁琐,意义不大。
| 273 | Integer to English Words | 21.1% | Hard |
下面这个代码写的非常的赞。逻辑很清晰。递归和函数都组织的很好。
private final String[] LESS_THAN_20 = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
private final String[] TENS = {"", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
private final String[] THOUSANDS = {"", "Thousand", "Million", "Billion"};
public String numberToWords(int num) {
if (num == 0) return "Zero";
int i = 0;
String words = "";
while (num > 0) {
if (num % 1000 != 0)
words = helper(num % 1000) +THOUSANDS[i] + " " + words;
num /= 1000;
i++;
}
return words.trim();
}
private String helper(int num) {
if (num == 0)
return "";
else if (num < 20)
return LESS_THAN_20[num] + " ";
else if (num < 100)
return TENS[num / 10] + " " + helper(num % 10);
else
return LESS_THAN_20[num / 100] + " Hundred " + helper(num % 100);
}
| 30 | Substring with Concatenation of All Words | 21.7% | Hard |
下面代码写的很好。
// travel all the words combinations to maintain a window
// there are wl(word len) times travel
// each time, n/wl words, mostly 2 times travel for each word
// one left side of the window, the other right side of the window
// so, time complexity O(wl * 2 * N/wl) = O(2N)
vector<int> findSubstring(string S, vector<string> &L) {
vector<int> ans;
int n = S.size(), cnt = L.size();
if (n <= || cnt <= ) return ans; // init word occurence
unordered_map<string, int> dict;
for (int i = ; i < cnt; ++i) dict[L[i]]++; // travel all sub string combinations
int wl = L[].size();
for (int i = ; i < wl; ++i) {
int left = i, count = ;
unordered_map<string, int> tdict;
for (int j = i; j <= n - wl; j += wl) {
string str = S.substr(j, wl);
// a valid word, accumulate results
if (dict.count(str)) {
tdict[str]++;
if (tdict[str] <= dict[str])
count++;
else {
// a more word, advance the window left side possiablly
while (tdict[str] > dict[str]) {
string str1 = S.substr(left, wl);
tdict[str1]--;
if (tdict[str1] < dict[str1]) count--;
left += wl;
}
}
// come to a result
if (count == cnt) {
ans.push_back(left);
// advance one word
tdict[S.substr(left, wl)]--;
count--;
left += wl;
}
}
// not a valid word, reset all vars
else {
tdict.clear();
count = ;
left = j + wl;
}
}
} return ans;
}
| 440 | K-th Smallest in Lexicographical Order | 22.1% | Hard |
我给出的解法很好(当然了,也是参考了别人的)。使用了前缀、范围等各种技巧来处理。很不错。
| 140 | Word Break II | 22.2% | Hard |
其实题目不难。用递归,然后用DP加速。开始的时候,我没有一下子想到。开始我也想到用Trie树去查找,但是Trie树会复杂一些,而且不如Hash快。
| 212 | Word Search II | 22.2% | Hard |
这道题目就是可以用Trie树了。
复习下Trie树的加入。就是26个子树,如果是叶子,标记一下;如果不是叶子,继续递归加。
取的时候,对于每一个格子的元素,如果Trie树找到,就移动到相应的子树,或者是叶子就添加结果;如果Trie树没有找到,就返回。
| 269 | Alien Dictionary | 22.3% | Hard |
解法很复杂。都要建立图。图是用unordered_map(C++)来处理的。一种使用类似DFS的拓扑排序。注意排序的时候要用visited和path两个数组,前一个是记录是否访问过,后一个是记录是否有环。
另外一种是用BFS的解法,来计算每个节点的入度,然后根据入度来一个一个取出来。
| 174 | Dungeon Game | 22.9% | Hard |
我之前的方法用的是DP。但是现在我想到了一个很好的方法,就是从右下角开始,往上和往左回溯,来发现最小的代价。
| 214 | Shortest Palindrome | 23.0% | Hard |
这个在回文类题目系列里面也有写到。通过先反向,再用KMP的next数组来辅助。能够做出来。
另外下面这个方法真是太绝妙了:直接理解有点难。
int j = 0;
for (int i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) == s.charAt(j)) { j += 1; }
}
if (j == s.length()) { return s; }
String suffix = s.substring(j);
return new StringBuffer(suffix).reverse().toString() + shortestPalindrome(s.substring(0, j)) + suffix;
但是反过来理解,如果中间那段能够是回文,那j必然走到了中间那段的后面,说明中间那段必然不是回文。那么后面的就必然是结果的一部分。再把中间的进行递归,就行了。
Hard模式题目的更多相关文章
- 剑指Offer面试题:1.实现Singleton模式
说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...
- 剑指offer题目java实现
Problem2:实现Singleton模式 题目描述:设计一个类,我们只能生成该类的一个实例 package Problem2; public class SingletonClass { /* * ...
- 【剑指offer】面试题 2. 实现 Singleton 模式
面试题 2. 实现 Singleton 模式 题目:设计一个类,我们只能生成该类的一个实例. 单例模式:确保一个类只有一个实例,并提供了一个全局访问点. Java 实现 1.饿汉模式 //饿汉模式 p ...
- 剑指Offer对答如流系列 - 实现Singleton模式
目录 面试题2:实现Singleton模式 一.懒汉式写法 二.饿汉式写法 三.枚举 面试题2:实现Singleton模式 题目:设计一个类,我们只能生成该类的一个实例. 由于设计模式在面向对象程序设 ...
- 《剑指offer》面试题2:实现Singleton 模式
面试题2:实现Singleton 模式 题目:设计一个类,我们只能生成该类的一个实例. 只能生成一个实例的类是实现了Singleton (单例)模式的类型.由于设计模式在面向对象程序设计中起着举足 ...
- .NET面试题解析(06)-GC与内存管理
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 GC作为.NET的重要核心基础,是必须要了解的.本文主要侧重于GC内存管理中的一些关键点,如要要全面深入了 ...
- 团队作业八—第二次团队冲刺(Beta版本) 第 1 天
一.每个人的工作 (1) 昨天已完成的工作 由于是才刚开始冲刺,所以没有昨天的工作 (2) 今天计划完成的工作: 对界面的优化和一些细节的完善 (3) 工作中遇到的困难: 工作中出现了意见不一的情况 ...
- 团队作业八—第二次团队冲刺(Beta版本) 第 2 天
一.每个人的工作 (1) 昨天已完成的工作 昨天的工作主要是一些界面的设计,我们顺利完成了复杂模式题目数目界面.复杂模式做题界面.结果统计界面的具体代码编写,和一些细节的完善.还有日常冲刺博客的编辑. ...
- 【剑指offer】【python】面试题2~5
使用python实现<剑指offer>面试题ヾ(◍°∇°◍)ノ゙,以此记录. 2_实现Singleton模式 题目:实现单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含 ...
随机推荐
- Akka源码分析-Remote-Actor创建
在之前的博客中,我们分析过local模式下Actor的创建过程,最终还是调用了provider的actorOf的函数创建了Actor,在remote模式下provider就是RemoteActorRe ...
- matlab中增加Java VM 的堆空间(解决xml_io_tools出现的OutOfMemory问题)
今天用MATLAB写程序,调用了xml_io_tools(很赞的一个xml读写工具包)中的函数,但是由于我要书写的文件比较大,5m左右,运行时不知道xml_io_tools中的哪一块超出了java中的 ...
- BZOJ 5277 IQ题orz
思路: 首先我们注意到,对一个序列按分割点分开以后分别冒泡其实就相当于对整个序列进行冒泡.每一个元素都会对复杂度贡献1,除非一个元素两边的分割点都出现了.因此我们可以完全忽略快排的递归过程.只需考虑每 ...
- 【知识总结】扩展卢卡斯定理(exLucas)
扩展卢卡斯定理用于求如下式子(其中\(p\)不一定是质数): \[C_n^m\ mod\ p\] 我们将这个问题由总体到局部地分为三个层次解决. 层次一:原问题 首先对\(p\)进行质因数分解: \[ ...
- flask中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- 题解报告:hdu 1863 畅通工程
Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可 ...
- Mac上随时切换PYTHON版本
在MAC上,默认安装了python2.*,自己又安装了python3.*:假如我们需要在终端上随时切换python控制台到需要的版本,可以采用下面的方法. 1.用命令 sudo vi ~/.bas ...
- 【Java基础】多态
首先先来个总结: 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消 ...
- 设计模式——“signleton”
那天别人问了我一个问题,关于单例模式的,由于之前了解的都是蜻蜓点水,所以重新复习了一次重新总结. 单例模式的写法总的来说有5种:懒汉,恶汉,枚举,双重校验锁,静态内部类 懒汉 public class ...
- css 众妙之门 学习笔记
伪类: 结构伪类: :empty :only-child :before :after :active :hover :focus :link :visited :first-child :last- ...