add link
This commit is contained in:
@@ -4,11 +4,13 @@
|
||||
|
||||
* 回文判断
|
||||
* 字符(串)统计
|
||||
* [子串查找](1.1%20字符串-查找.md)
|
||||
* [字符串修改](1.3%20字符串-修改.md) 如单词反转/移动等
|
||||
* [字符删除](1.2%20字符串-删除.md)
|
||||
* 字符串的压缩
|
||||
* 字符串的排列和组合
|
||||
* [子串查找](1.1%20字符串-查找.md)
|
||||
* [字符删除](1.2%20字符串-删除.md)
|
||||
* [字符串修改](1.3%20字符串-修改.md) 如单词反转/移动等
|
||||
|
||||
|
||||
|
||||
|
||||
## 判断字符串是否是回文
|
||||
|
||||
@@ -45,19 +45,6 @@ char char_first_appear_once(const unsigned char *source){
|
||||
题目扩展:这里的字符换成整数,整数数量几十TB,海量数据处理,显然hash方法不可能,没有那么大得内容
|
||||
|
||||
|
||||
## 请编写能直接实现strstr()函数功能的代码。
|
||||
|
||||
> strstr(str1,str2) 判断str2是否是str1的子串。
|
||||
|
||||
```
|
||||
/*
|
||||
@ret 有就返回第一次出现子串的地址,否则返回NULL
|
||||
*/
|
||||
char *strstr(const char *source, const char *target){
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### 字符串中找出连续最长的数字子串
|
||||
|
||||
@@ -164,11 +151,6 @@ int lengthOfLongestSubstring(string s) {
|
||||
|
||||
|
||||
|
||||
## 求最大连续递增数字子串
|
||||
|
||||
如“ads3sl456789DF3456ld345AA”中的“456789”就是所求。这道题在上一道题目的基础上增加了数字要递增的条件。思路跟上面差不多,碰到不递增的数字就相当于第二个数字串了。
|
||||
|
||||
|
||||
|
||||
## 最长公共子串问题
|
||||
|
||||
@@ -247,6 +229,27 @@ int max_symmetrical_char_length(const char *scr){
|
||||
|
||||
|
||||
|
||||
|
||||
## 求最大连续递增数字子串
|
||||
|
||||
如“ads3sl456789DF3456ld345AA”中的“456789”就是所求。这道题在上一道题目的基础上增加了数字要递增的条件。思路跟上面差不多,碰到不递增的数字就相当于第二个数字串了。
|
||||
|
||||
|
||||
## 请编写能直接实现strstr()函数功能的代码。
|
||||
|
||||
> strstr(str1,str2) 判断str2是否是str1的子串。
|
||||
|
||||
```
|
||||
/*
|
||||
@ret 有就返回第一次出现子串的地址,否则返回NULL
|
||||
*/
|
||||
char *strstr(const char *source, const char *target){
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 子串匹配的个数
|
||||
|
||||
已知一个字符串,比如asderwsde,寻找其中的一个子字符串比如sde的个数,如果没有返回0,有的话返回子字符串的个数。
|
||||
|
||||
@@ -10,12 +10,14 @@
|
||||
* 链表中是否有环
|
||||
|
||||
|
||||
链表结点定义如下:
|
||||
链表结点定义如下:
|
||||
```
|
||||
struct ListNode
|
||||
{
|
||||
int m_nKey;
|
||||
ListNode* m_pNext;
|
||||
};
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -110,6 +112,15 @@ struct ComplexNode
|
||||
请完成函数`ComplexNode* Clone(ComplexNode* pHead)`,以复制一个复杂链表。
|
||||
|
||||
|
||||
这个题目难点在于:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -25,8 +25,6 @@ void sort(int * a, int length)
|
||||
|
||||
`动态规划`
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 扑克牌的顺子
|
||||
|
||||
@@ -87,13 +87,38 @@ topMaxK(int *a,int length, int k);
|
||||
|
||||
## 找第k大的数
|
||||
|
||||
比如 1,2,3,4,5,6,7和8这8个数字,低3大的数字是 6
|
||||
比如 `1,2,3,4,5,6,7,8 `这 8个数字,第3大的数字是 6
|
||||
|
||||
```
|
||||
int topK(int * a, int length, int k)
|
||||
```
|
||||
|
||||
|
||||
```Java
|
||||
//冒泡实现
|
||||
public int findK(int[] nums, int k){
|
||||
//base case
|
||||
if (nums== null || nums.length < k) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for(int i=1; i<=k; i++){
|
||||
for(int j=0; j<nums.length-i; j++) {
|
||||
int next = j+1;
|
||||
if(nums[j]> nums[next]){
|
||||
int tmp = nums[j];
|
||||
nums[j] = nums[next];
|
||||
nums[next] = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nums[nums.length-k];
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
## 最长公共子序列 (动态规划的经典题目)
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
* 编程细节:多练习,总结
|
||||
|
||||
|
||||
常用解题套路工具
|
||||
## 常用解题套路工具
|
||||
|
||||
* 数组,字符串问题:二分查找、 快慢指针、 左右指针、 滑动窗口、 前缀和数组、 差分数组。
|
||||
* 二叉树问题:递归
|
||||
@@ -21,6 +21,59 @@
|
||||
* [常见算法题目Java实现](https://github.com/nonstriater/deep-in-java/tree/master/src/main/java/com/nonstriater/deepinjava/algo)
|
||||
|
||||
|
||||
## 刷题框架套路
|
||||
|
||||
|
||||
遍历
|
||||
|
||||
```
|
||||
# 数组遍历框架
|
||||
void traverse(int[] arr) {
|
||||
for (int i = 0; i < arr.length; i++) {
|
||||
// 迭代访问 arr[i]
|
||||
}
|
||||
}
|
||||
|
||||
# 链表遍历框架
|
||||
void traverse(ListNode head) {
|
||||
for (ListNode p = head; p != null; p = p.next) {
|
||||
// 迭代访问 p.val
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
递归
|
||||
|
||||
```
|
||||
# 链表递归
|
||||
void traverse(ListNode head) {
|
||||
// 递归访问 head.val
|
||||
traverse(head.next);
|
||||
}
|
||||
|
||||
|
||||
# 二叉树递归
|
||||
void traverse(TreeNode root) {
|
||||
traverse(root.left);
|
||||
traverse(root.right);
|
||||
}
|
||||
|
||||
# 多叉树递归
|
||||
void traverse(TreeNode root) {
|
||||
for (TreeNode child : root.children)
|
||||
traverse(child);
|
||||
}
|
||||
|
||||
# 图的递归:,用个布尔数组 visited 做标记就行了
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [字符串](1%20字符串.md)
|
||||
|
||||
计算机处理的数据除了数值,就是字符。字符处理的常见问题包括:
|
||||
@@ -95,56 +148,6 @@
|
||||
|
||||
|
||||
|
||||
# 刷题框架套路
|
||||
|
||||
遍历
|
||||
|
||||
```
|
||||
# 数组遍历框架
|
||||
void traverse(int[] arr) {
|
||||
for (int i = 0; i < arr.length; i++) {
|
||||
// 迭代访问 arr[i]
|
||||
}
|
||||
}
|
||||
|
||||
# 链表遍历框架
|
||||
void traverse(ListNode head) {
|
||||
for (ListNode p = head; p != null; p = p.next) {
|
||||
// 迭代访问 p.val
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
递归
|
||||
|
||||
```
|
||||
# 链表递归
|
||||
void traverse(ListNode head) {
|
||||
// 递归访问 head.val
|
||||
traverse(head.next);
|
||||
}
|
||||
|
||||
|
||||
# 二叉树递归
|
||||
void traverse(TreeNode root) {
|
||||
traverse(root.left);
|
||||
traverse(root.right);
|
||||
}
|
||||
|
||||
# 多叉树递归
|
||||
void traverse(TreeNode root) {
|
||||
for (TreeNode child : root.children)
|
||||
traverse(child);
|
||||
}
|
||||
|
||||
# 图的递归:,用个布尔数组 visited 做标记就行了
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
# 参考
|
||||
|
||||
|
||||
Reference in New Issue
Block a user