题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree){
if(pRootOfTree == NULL) return NULL;
TreeNode* preNode = NULL;
convert2List(pRootOfTree,preNode);
while(pRootOfTree->left != NULL){
pRootOfTree = pRootOfTree->left;
}
return pRootOfTree;
}
void convert2List(TreeNode* pRootOfTree, TreeNode*& pre){
if(pRootOfTree == NULL){
return;
}
convert2List(pRootOfTree->left,pre);
pRootOfTree->left = pre;
if(pre != NULL){
pre->right = pRootOfTree;
}
pre = pRootOfTree;
convert2List(pRootOfTree->right,pre);
}
};
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
class Solution {
public:
vector<string> Permutation(string str) {
if(str.length() == 0){
return result;
}
getPermutation(str, 0);
sort(result.begin(),result.end());
return result;
}
void getPermutation(string &str, int start){
if(start == str.length()){
result.push_back(str);
return;
}
for(int i = start; str[i] != '\0'; i++){
if(i != start && str[i] == str[start]){
continue;
}
swap(str[start],str[i]);
getPermutation(str,start+1);
swap(str[start],str[i]);
}
}
private:
vector<string> result;
};
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> v) {
if(v.empty()){
return 0;
}
int number = v[0];
int cur = 1;
for(int i = 1; i < v.size(); i++){
if(number != v[i]){
cur--;
if(cur == 0){
number = v[i];
cur = 1;
}
}else{
cur++;
}
}
cur = 0;
for(int i = 0; i < v.size(); i++){
if(number == v[i]){
cur++;
}
}
if(cur > v.size()/2){
return number;
}
return 0;
}
};