简单的leetcode题

环绕字符串中唯一的子字符串

把字符串 s 看作是\(“abcdefghijklmnopqrstuvwxyz”\)的无限环绕字符串,所以 s 看起来是这样的\(“zabcdefghijklmnopqrstuvwxyzabcdefghijklm....”\)

现在我们有了另一个字符串 p 。你需要的是找出 s 中有多少个唯一的 p 的非空子串,尤其是当你的输入是字符串 p ,你需要输出字符串 s 中 p 的不同的非空子串的数目。

注意: p 仅由小写的英文字母组成,p 的大小可能超过 10000。

分析:我们以26字母分别结尾为划分,这样可以保证子字符串不重复。答案就是每个字母结尾的最大子字符串长度加起来。

class Solution {
public:
int findSubstringInWraproundString(string p) {
if(p.size()==0)
return 0;
int dp[27]={0};//以每个字母结尾的字串长度
int last=1;//此时结尾处的长度
dp[p[0]-'a']=1;//边界条件
for(int i=1;i<p.size();i++)
{
if(dp[p[i]-'a']==0)
dp[p[i]-'a']=1;
int j=i-1;
if((p[i]-p[j]+26)%26==1)//判断条件
{
if(last+1>=dp[p[i]-'a'])//出现更加长的子串
{
dp[p[i]-'a']=last+1;
}
last++;
}
else
last=1;
}
int ans=0;
for(int i=0;i<26;i++)
{
ans+=dp[i];
}
return ans;
}
};

二叉树的右视图

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

非递归版本

分析:二叉树层次遍历,然后只加最后一个点的值即可。

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int>ans;
queue<TreeNode* >Q;
if(root)
Q.push(root);
while(Q.size())
{
int n=Q.size();
for(int i=0;i<n;i++)
{
TreeNode* cur=Q.front();
Q.pop();
if(i==n-1)
ans.push_back(cur->val);
if(cur->left)
Q.push(cur->left);
if(cur->right)
Q.push(cur->right);
}
}
return ans;
}
};

递归版本

分析:当递归到第k层时(设根节点为第0层),如果这时ans数组里面有k个元素,加把此时的节点的值加入ans数组中。

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int>ans;
dfs(root,ans,0);
return ans;
}
void dfs(TreeNode* root,vector<int> &ans,int cnt)
{
if(!root)
return ;
if(ans.size()==cnt)
ans.push_back(root->val);
dfs(root->right,ans,cnt+1);
dfs(root->left,ans,cnt+1);
}
};

合并两个有序链表

递归版本

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==NULL)
return l2;
else if(l2==NULL)
return l1;
else if(l1->val<l2->val)
{
l1->next=mergeTwoLists(l2,l1->next);
return l1;
}
else
{
l2->next=mergeTwoLists(l1,l2->next);
return l2;
}
}
};

非递归版本

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* prehead = new ListNode(-1);
ListNode* prev = prehead;
while(l1&&l2)
{
if(l1->val<l2->val)
{
prev->next=l1;
l1=l1->next;
}
else
{
prev->next=l2;
l2=l2->next;
}
prev=prev->next;
}
prev->next=l1!=NULL?l1:l2;
return prehead->next;
}
};

排序链表

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* sortList(ListNode* head) {
ListNode Head(-1);
Head.next=head;
ListNode* p=head;
int len=0;
while(p)
{
len++;
p=p->next;
}
for(int siz=1;siz<len;siz=siz*2)
{
ListNode* cur=Head.next;
ListNode* tail=&Head;
while(cur)
{
ListNode* left=cur;
ListNode* right=cut(left,siz);
cur=cut(right,siz);
tail->next=merge(left,right);
while(tail->next)
{
tail= tail->next;
}
} }
return Head.next;
}
ListNode* cut(ListNode* p,int n)
{
while(p&&--n)
{
p=p->next;
}
if(!p)
return NULL;//返回空指针
ListNode* r=p->next;
p->next=NULL;
return r;
}
ListNode* merge(ListNode* l1,ListNode* l2)
{
ListNode head(-1);
ListNode* p=&head;
while(l1&&l2)
{
if(l1->val<l2->val)
{
p->next=l1;
l1=l1->next;
}
else
{
p->next=l2;
l2=l2->next;
}
p=p->next;
}
p->next=(l1?l1:l2);
return head.next;
}
};

简单的leetcode题的更多相关文章

  1. 简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现。

    简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现. 题目: Suppose a sorted array is rotated at som ...

  2. leetcode题库

    leetcode题库 #题名题解通过率难度出现频率  1 两数之和     46.5%简单2 两数相加     35.5%中等3 无重复字符的最长子串     31.1%中等4 寻找两个有序数组的中位 ...

  3. QDUOJ 一道简单的数据结构题 栈的使用(括号配对)

    一道简单的数据结构题 发布时间: 2017年6月3日 18:46   最后更新: 2017年6月3日 18:51   时间限制: 1000ms   内存限制: 128M 描述 如果插入“+”和“1”到 ...

  4. 实验吧之【简单的登录题(】CBC字节反转攻击)

    开始刷ctf题吧  慢慢来. 实验吧---简单的登录题 题目地址:http://ctf5.shiyanbar.com/web/jiandan/index.php 随便提交一个id,看到后台set了两个 ...

  5. CTF实验吧-WEB题目解题笔记(1)简单的登陆题

    1.简单的登陆题 解题链接: http://ctf5.shiyanbar.com/web/jiandan/index.php  Burp抓包解密 乱码,更换思路.尝试id intruder 似乎也没什 ...

  6. 【leetcode 简单】第四十一题 Excel表列序号

    给定一个Excel表格中的列名称,返回其相应的列序号. 例如, A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...

  7. 【leetcode 简单】第九题 移除元素

    给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  8. 【leetcode 简单】第二题 反转整数

    给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假 ...

  9. 【leetcode 简单】第一题 两数之和

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...

随机推荐

  1. pugixml简单实用

    实现快递查询,调用快递100的API,未完成. #include <iostream> #include <fstream> #include <string> # ...

  2. LintCode 433. 岛屿的个数(Number of Islands)

    LintCode 433. 岛屿的个数(Number of Islands) 代码: class Solution: """ @param grid: a boolean ...

  3. python 更改pip源

    用pip安装依赖包时默认访问https://pypi.Python.org/simple/,但是经常出现不稳定以及访问速度非常慢的情况,国内厂商提供的pipy镜像目前可用的有: http://pypi ...

  4. [Python源码剖析]获取Python小整数集合范围

    #!/usr/bin/env python #-*- coding=utf-8 -*- small_ints = dict() for i in range(-10000,10000): small_ ...

  5. Codeforces_334_C

    http://codeforces.com/problemset/problem/334/C 求不能凑整n,和最小,数量最多的数量. #include<iostream> #include ...

  6. HDU 6521 K-th Closest Distance (主席树+二分)

    题意: 给你一个数组,q次询问,每次问你[l,r]范围内与p距离第k大的元素的与p的距离,强制在线 思路: 主席树提取出[l,r]内的权值线段树,然后二分与p的距离mid ask该权值线段树里[p-m ...

  7. 3、实战:OutOfMemoryError异常

    目的:第一,通过代码验证Java虚拟机规范中描述的各个运行时区域存储的内容:第二,工作中遇到实际的内存溢出异常时,能根据异常的信息快速判断是哪个区域的内存溢出,知道什么样的代码可能会导致这些区域内存溢 ...

  8. 搭建 Kubernetes 集群

    1.节点规划 master节点:192.168.188.135 node   节点:(node1)192.168.188.136,(node2)192.168.188.137 2.禁用SELinux ...

  9. Python3(三) 变量与运算符

    一.什么是变量 变量 = [1,2] 二.变量的命名规则 字母,数字,下划线,首字母不能是数字 系统关键字 不能用在变量名中 保留关键字 区别大小写 a=1,   a='1',   a=(1,2),  ...

  10. linux硬盘分区、格式化、挂载超详细步骤(fdisk/parted))