【Vector、stack、queue】
https://blog.csdn.net/u013846293/article/details/79410293
1.二叉树深度
int height(TreeNode* pRoot){
if(pRoot == NULL){
return 0;
}
int leftlen = height(pRoot->left);
int rightlen = height(pRoot->right);
return leftlen > rightlen? leftlen+1 : rightlen+1;
}
2.输入一棵二叉树,判断该二叉树是否是平衡二叉树。(注意中英文括号和变量名)
class Solution {
public:
int height(TreeNode* pRoot){
if(pRoot == NULL){
return 0;
}
int leftlen = height(pRoot->left);
int rightlen = height(pRoot->right);
return leftlen > rightlen? leftlen+1 : rightlen+1;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
if(pRoot == NULL)
return 1;
int left_len = height(pRoot->left);
int right_len = height(pRoot->right);
if((left_len - right_len > 1)||(left_len - right_len < -1))
return 0;
else
return IsBalanced_Solution(pRoot->left)&&IsBalanced_Solution(pRoot->right);
}
};
3.一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
class Solution {
public:
void FindNumsAppearOnce(vector data,int* num1,int *num2) {
int temp = 0;
int len = sizeof(data) / sizeof(data[0]);
for(int i = 0; i> j )& 1) != 1){
j++;
}
int k1 = 0;
int k2 = 0;
for(int i = 0;i < len;i++){
if(((data[i] >> j) &1) == 0){
num1[k1++] = data[i];
}else{
num2[k2++] = data[i];
}
}
temp=0;
for(int i = 0; i< k1; i++){
temp = temp ^ num1[i];
}
num1[0] = temp;
temp=0;
for(j = 0 ; j< k2; j++){
temp = temp ^ num2[j];
}
num2[0] = temp;
}
};
4.在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:找出最右上角的元素,如果此整数为右上元素,返回True;此整数>右上元素,删除行;否则删除列(删除用动态的”指针“指向表示)
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
#列
cols = len(array[0])
rows = len(array)
if(cols == 0 or rows == 0):
return False
if(target < array[0][0] or target > array[rows-1][cols-1]):
return False
row = 0
col = cols - 1
while(row < rows and col >= 0):
if array[row][col] == target:
return True
elif array[row][col] < target:
row += 1
else:
col -= 1
return False
5.请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:创建一个新字符串,当前串不为空格直接添加到新串,否则将%20加入新串
# -*- coding:utf-8 -*-
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here
a=""
for i in s:
if i != ' ':
a += i
else:
a += "%20"
return a
6.(python)输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
思路:列表实现栈
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 返回从尾部到头部的列表值序列,例如[1,2,3]
def printListFromTailToHead(self, listNode):
# write code here
a = []
b = []
if not listNode:
return b
p = listNode
while p:
a.append(p.val)
p = p.next
while a:
b.append(a.pop())
return b
7.输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:先序递归
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
# write code here
if len(pre)== 0:
return None
T = TreeNode(pre[0])
i = tin.index(pre[0])
T.left = self.reConstructBinaryTree(pre[1:i+1],tin[:i])
T.right = self.reConstructBinaryTree(pre[i+1:],tin[i+1:])
return T
8.用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路:
入队 判断s1是否为空,空将s2压入s1,压栈到s1;否则直接压栈到s1
出队 判断s2是否为空,空将s1压入s2,s2出栈;否则直接出栈
居然还需要自己写类属性s1,s2
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.s1 = []
self.s2 = []
def push(self, node):
# write code here
if self.s1:
self.s1.append(node)
else:
while self.s2:
self.s1.append(self.s2.pop())
self.s1.append(node)
def pop(self):
if not self.s2:
while self.s1:
self.s2.append(self.s1.pop())
return self.s2.pop()
# return xx
9.把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:找到第一个比array[0]小的元素即可
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if len(rotateArray) == 0:
return 0
for i in rotateArray:
if(i < rotateArray[0]):
j = rotateArray.index(i)
return rotateArray[j]
10.大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
思路:用两个变量暂存中间值(非递归),f(2),f(n) 计算n-1次range(1,n)
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if(n == 0):
return 0
if(n == 1):
return 1
Fibonacci0 = 0
Fibonacci1 = 1
for i in range(1,n):
Fibonacci = Fibonacci0 + Fibonacci1
Fibonacci0 = Fibonacci1
Fibonacci1 = Fibonacci
return Fibonacci
11.一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路:递归(考虑到复杂的 不使用递归)
1级跳1种
2级跳2种(1,1;2)
3级 :第一次条1级,剩下的3-1级有n1种跳法;第一次跳2级,剩下的3-2级有n2种跳法
n级别:F(n-1)+F(n-2)
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, number):
# write code here
if(number <= 0):
return 0
if(number == 1):
return 1
if(number == 2):
return 2
floor1 = 1;
floor2 = 2
for i in range(2,number):
floor =floor1+ floor2
floor1 = floor2
floor2 = floor
return floor
12.我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路:
竖着1块,剩下f(n-1)
横着2快,剩下f(n-2)
递归的思想
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
if(number == 1):
return 1
if(number == 2):
return 2
temp1 = 1
temp2 = 2
temp = 0
for i in range(2,number):
temp = temp1 + temp2
temp1 = temp2
temp2 = temp
return temp
13.输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:一个数-1 与 原数字相比 只是将原数字最右边1的(含)右边的所有二进制取反,所以计算二进制1的个数也就是这样操作的个数
不太明白n<0 为何python 写成 n=n&0xFFFF
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
count = 0
if n<0:
n = n & 0xffffffff
while n:
count += 1
n = n & (n - 1)
return count
14.给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路:base为0 Fasle exponent<0 1/(base**exponent) 否则 base**exponent)
考虑到别的编程语言,** 利用for计算
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
# write code here
if base == 0:
return False
ret = 1
exp = abs(exponent)
for i in range(exp):
ret *= base
if exponent <0:
return 1/ret
else:
return ret
或者利用python的指数运算**
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
# write code here
if base == 0:
return False
return base**exponent
15.在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
思路:数字是0-n-1,联想到哈希表,将数组近似重排:0索引放0,1索引放1....遇到索引和元素不同的,交换,直到发现重复数字,while(numbers[i] != i){ ------------不能用if
class Solution {
public:
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
bool duplicate(int numbers[], int length, int* duplication) {
int t = 0,temp = 0;
if(length <= 0 || duplication == NULL)
return false;
for( int i = 0;i < length;i++){
while(numbers[i] != i){
t = numbers[i];
if(numbers[t] == t){
*duplication = t;
return true;
}
temp = numbers[t];
numbers[t] = numbers[i];
numbers[i] = temp;
}
}
return false;
}
};
//O(n)
class Solution {
public:
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
bool duplicate(int numbers[], int length, int* duplication) {
int temp = 0;
if(length <= 0 || duplication == NULL)
return false;
for( int i = 0;i < length;i++){
while(numbers[i] != i){
if(numbers[i] == numbers[numbers[i]]){
*duplication = numbers[numbers[i]];
return true;
}
temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
}
}
return false;
}
};
fun(int *t){
*t=8;
}
不修改数组找出重复数字:(创建辅助数组,1——n 无重复数字应该有n个数,二分查找,统计区间数据个数)
int getDuplication(const int *numbers,int length)
{
if(numbers == NULL || length <= 0)
return -1;
int start = 1;
int end = length - 1;
while(end >= start ){
int middle = ((end - start) >> 1) + start;
int count = countRange(numbers,length,start,end);
if(end == start){
if(count > 1)
return start;
else
break;
}
}
}
16.从上往下打印出二叉树的每个节点,同层节点从左至右打印。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector PrintFromTopToBottom(TreeNode* root) {
queue nodequeue;
vector node;
if(root == NULL){
return node;
}else{
nodequeue.push(root);
}
while(!nodequeue.empty()){
TreeNode* p = nodequeue.front();
nodequeue.pop();
node.push_back(p->val);
if(p->left){
nodequeue.push(p->left);
}
if(p->right){
nodequeue.push(p->right);
}
}
return node;
}
};
17:题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:
输入空字符串返回空;
输入只有1个字符的串直接返回;
abc ---》sort().....................
a bc全排列
b ac全排列
c ab全排列
连接首字母+子串全排列
# -*- coding:utf-8 -*-
class Solution:
def Permutation(self, ss):
str = [];
if ss == []:
return
if len(ss)==1:
return ss
str = list(ss)
str.sort()
pstr =[]
for i in range(len(str)):
if i>0 and str[i] == str[i-1]:
continue
temp = self.Permutation(''.join(str[:i])+''.join(str[i+1:]))
for j in temp:
pstr.append(str[i]+j)
return pstr
# write code here