剑指offer-字符的所有组合,复制复杂链表,二叉树中和为某一值的路径
字符的所有组合
描述:
输入一个字符串,求这个字符串中的字符的所有组合。如:“abc”,组合为"a" "b" c" "ab" "ac" "bc" "abc"
思路:
对于n个字符,求长度为m的组合,将字符分为两部分,对于当前的字符,要么取,然后再n-1个字符中取m-1个,要么不取,在n-1个字符中取m个。
代码:
void combination(string s, int num, vector<char>res);
void combination(string s)
{
if (s.empty())
return;
vector<char> res;
int number = s.size();
for (int i = 1; i <= number; i++) //组合长度
{
combination(s,i, res);
}
}
void combination(string s, int num, vector<char>res)
{
if (num == 0) //递归出口
{
static int n = 1;
cout << "这是第" << n << "个组合" << endl;
n++;
vector<char>::iterator it;
for (it = res.begin(); it != res.end(); it++)
{
cout << *it;
}
cout << endl;
return;
}
if (s.size() == 0)
return ;
res.push_back(s[0]);
s = s.assign(s,1, s.size() - 1);
combination(s, num - 1, res); //要么加入这个字符,在接下来的字符串中找num-1个字符
res.pop_back();
combination(s, num , res); // 要么不加入这个字符,在接下来的字符串中找num个字符。
}
复制复杂链表
描述:
复制一个复杂的链表,链表节点除了next指针,还有随机的指针指向NULL或任意节点。
思路:
分解问题。第一步,在每个节点后复制一个原节点,并用next链接。第二步,链接随机指针,每个复制的节点的随即指针的指向都是前一个节点的随机指针指向的节点的后一个节点。
最后,分离链表。
代码:
struct CpxListNode
{
int v;
CpxListNode* next;
CpxListNode* sibing;
};
void CloneNodes(CpxListNode* head)
{
CpxListNode* p = head;
while (p)
{
CpxListNode* cp = new CpxListNode;
cp->v = p->v;
cp->sibing = NULL;
cp->next = p->next;
p->next = cp;
p = cp->next;
}
}
void ConnectSibing(CpxListNode* head)
{
CpxListNode* p = head;
while(p)
{
CpxListNode* cp = p->next;
if(p->sibing)
cp->sibing = p->sibing->next;
p = cp->next;
}
}
CpxListNode* ReConnect(CpxListNode* head)
{
CpxListNode* chead=NULL;
CpxListNode* p=head;
CpxListNode* cp = NULL;
if (p)
{
chead = p->next;
cp = chead;
}
while (p)
{
p->next = cp->next;
p = p->next;
cp->next = p->next;
cp = cp->next;
}
return chead;
}
CpxListNode* CopyCL(CpxListNode* head)
{
CloneNodes(head); //将复制后的节点插入原节点后面
ConnectSibing(head); //sibing指针的处理
return ReConnect(head); //分离链表
}
二叉树中和为某一值的路径
描述:
对于给定值k,要求在二叉树中找到一条路径,路径上的节点值和为k。
思路:
先序遍历整个树,用栈来记录路径,采用递归的思想,当走到一个节点,当前的和为num,若它是叶子节点,则找到一条路径。否则再从它的左右子树中找。
代码:
void Findpath(TreeNode* root, int num, vector<int> path, int currentsum)
{
currentsum += root->v;
path.push_back(root->v);
if ((currentsum == num) && (root->left == NULL && root->right == NULL))
{
cout << "FIND" << endl;
for (int i = 0; i < path.size(); i++)
{
cout << path[i];
}
}
else
{
if (root->left != NULL)
{
Findpath(root->left, num, path, currentsum);
}
if (root->right)
{
Findpath(root->right, num, path, currentsum);
}
/*currentsum -= root->v;
path.pop_back();*/
//这边不用对currentsum和path操作,因为它们作为变量传入,返回时自动恢复,如果它们作为静态变量,则需要手动恢复。
}
}
void FindInTree(TreeNode* root, int num)
{
if (root == NULL)
{
return;
}
int currcentsum = 0;
vector<int> path;
Findpath(root, num, path, currcentsum);
}
剑指offer-字符的所有组合,复制复杂链表,二叉树中和为某一值的路径的更多相关文章
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...
- 【剑指Offer面试编程题】题目1368:二叉树中和为某一值的路径--九度OJ
题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 输入: 每个测试案例包括n+1行: 第一行为2 ...
- 《剑指offer》第三十四题(二叉树中和为某一值的路径)
// 面试题34:二叉树中和为某一值的路径 // 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所 // 有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. #i ...
- 《剑指offer》 合并两个排序的链表
本题来自<剑指offer> 合并两个排序的链表 题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路: A:采用递归的方式(C++ C ...
- 剑指offer 二叉树中和为某一个值的路径
剑指offer 牛客网 二叉树中和为某一个值的路径 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 15:53:58 2 ...
- 剑指Offer - 九度1368 - 二叉树中和为某一值的路径
剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...
- 剑指Offer:二叉树中和为某一值的路径【34】
剑指Offer:二叉树中和为某一值的路径[34] 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. ...
- 剑指Offer:合并两个排序的链表【25】
剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合 ...
- 剑指Offer(二十四):二叉树中和为某一值的路径
剑指Offer(二十四):二叉树中和为某一值的路径 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
随机推荐
- AMD R5 2400G插帧教程
最近买的小主机带的是AMD R5 2400G显卡,支持AMD的插帧技术,Sandeepin肯定要体验一把效果. BlueskyFRC 按照网上的教程配置,似乎2400G显卡驱动里没有AMD Fluid ...
- C语言寒假大作战01
问题 回答 这个作业属于哪个课程 2019软件四班C语言寒假作业大作战 这个作业要求在哪里 作业要求 我在这个课程的目标是 gitee 与 git基础命令学习与使用 这个作业在那个具体方面帮助我实现目 ...
- LeetCode刷题总结-链表
LeetCode刷题总结-链表 一.链表 链表分为单向链表.单向循环链表和双向链表,一下以单向链表为例实现单向链表的节点实现和单链表的基本操作. 单向链表 单向链表也叫单链表,是链表中最简单的 ...
- GC原理---垃圾收集算法
垃圾收集算法 Mark-Sweep(标记-清除算法) 标记清除算法分为两个阶段,标记阶段和清除阶段.标记阶段任务是标记出所有需要回收的对象,清除阶段就是清除被标记对象的空间. 优缺点:实现简单,容易产 ...
- Word Embeddings: Encoding Lexical Semantics(译文)
词向量:编码词汇级别的信息 url:http://pytorch.org/tutorials/beginner/nlp/word_embeddings_tutorial.html?highlight= ...
- 集合详解之 Map
集合详解之 Map + 面试题 集合有两个大接口:Collection 和 Map,本文重点来讲解集合中另一个常用的集合类型 Map. 以下是 Map 的继承关系图: Map 简介 Map 常用的实现 ...
- 最新2.7版本丨DataPipeline数据融合产品最新版本发布
此次发布的2.7版本在进一步优化产品底层数据处理逻辑的同时更加注重提升用户在数据融合任务的日常管理.运行监控及资源分配等管理方面的功能增强与优化,力求帮助大家更为直观.便捷.稳定地管理数据融合任务,提 ...
- 死磕java(7)
http://www.cnblogs.com/liunanjava/p/4296045.html 自己写的例子 package com.sougn.trynew; public abstract cl ...
- illegal use of this type as an expression
学习MCI时看别人样例手敲代码出现的一个很经典的错误. 在C语言中定义的变量没有放在函数的开头. #include <string.h> #include <windows.h> ...
- MybatisDao
一.mybatisDao的编写(原始方式,不用) 1.接口编写 public interface UserDao { public void save(User user); public User ...