defq_sort(L, left, right):if left < right:
pivot = Partition(L, left, right)
q_sort(L, left, pivot -1)
q_sort(L, pivot +1, right)return L
defPartition(L, left, right):
pivotkey = L[left]while left < right:while left < right and L[right]>= pivotkey:
right -=1
L[left]= L[right]while left < right and L[left]<= pivotkey:
left +=1
L[right]= L[left]
L[left]= pivotkey
return left
defmax_area_of_island(grid):ifnot grid:return0
l, h =len(grid),len(grid[0])defdfs(i, j):if0<= i < l and0<= j < h and grid[i][j]:
grid[i][j]=0#每找到一个位置的数为1时,就要把这个位置的数变为0return1+ dfs(i -1, j)+ dfs(i +1, j)+ dfs(i, j -1)+ dfs(i, j +1)return0#1)通俗写法for i inrange(lenr):for j inrange(lenc):if grid[i][j]==1:
count = dfs(i,j)
result =max(result,count)return result
#2)精简写法
result =[dfs(i, j)for i inrange(l)for j inrange(h)if grid[i][j]]returnmax(result)if result else0
defFind(target, array):# array 二维列表if array ==[[]]:returnFalse
m =len(array)# m行n列
n =len(array[0])
i =0
j = n -1while i < m or j >=0:if target == array[i][j]:#从右上角遍历returnTrueelif target > array[i][j]:# 右上角小于此数,删除行;否则删除列
i +=1if i >= m:returnFalseelse:
j -=1if j <0:returnFalse
c语言实现:
bool findNumberIn2DArray(int** matrix,int matrixSize,int* matrixColSize,int target){// printf("%d\n",*matrixColSize);int m =0, n =*matrixColSize -1;//注意带*,否则表示的是地址。if(matrixSize==0&&*matrixColSize ==0){return false;}while(m < matrixSize && n >=0){if(matrix[m][n]== target){return true;}elseif(matrix[m][n]> target){
n--;}else{
m++;}}return false;
2.2 替换空格
问题:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
defreplaceSpace(s):
li =[]
tmp =""for item in s:if item!=" ":
tmp += item
else:
li.append(tmp)
li.append("%20")
tmp =""
li.append(tmp)
result ="".join(li)return result
defminNumberInRotateArray(rotateArray):iflen(rotateArray)==0:return0
left =0
right =len(rotateArray)-1while left < right:
mid =int((left+right)/2)if rotateArray[mid]> rotateArray[right]:#最小值在右边 5>2
left = mid+1elif rotateArray[mid]< rotateArray[right]:#最小值在右边
right = mid
else:
right -=1#right-left=1的情况,right-1跳出循环return rotateArray[left]
defjumpFloor(number):if number <3:return number
else:#其实有没有else都不影响,只不过有了更好理解。
dp =[0,1,2]for i inrange(3,number+1):
dp.append(dp[i-1]+dp[i-2])return dp[-1]
inthammingWeight(uint32_t n){int count =0;while(n!=0){
n = n &(n-1);//核心!!!
count ++;}return count;}
2.11数值的整数次方
defPower(base, exponent):if exponent ==0:#递归边界条件return1elif exponent ==1:return base
elif exponent ==-1:return1/ base
ifabs(exponent)%2==0:#递归+二分法,减少运行次数
result = Power(base,abs(exponent)//2)
result *= result
else:
result = Power(base,abs(exponent)//2)
result *= result
result *= base
if exponent <0:
result =1/ result
return result
c语言
//自己版本1:doublemyPow(double x,int n){long num ;//定义为longdouble result;if(n==0){return1;}if(n==1){return x;}if(n==-1){return1/x;}// printf("%d%d\n",n,-n);if(n <0){
num = n;
num =-num;}//注意!!!num = -n 就报错,超出int长度else{num = n;}if(num%2==0){
result =myPow(x,num/2);
result *= result;}else{
result =myPow(x,num/2);
result *= result;
result *= x;}if(n<0){result =1/result;}return result;}//简易版本2:doublemyPow(double x,int n){if(0== n){return1;}if(n <0){return1/(x *myPow(x,-(n +1)));}if(0==(n &1)){//判断为偶数returnmyPow(x * x, n /2);}else{//奇数return x *myPow(x * x,(n -1)/2);}}
defreOrderArray(self, array):
list1 =[item for item in array if item%2==1]
list2 =[item for item in array if item%2==0]
result = list1 + list2
return result
2.13 链表中倒数第K个节点
# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = NonedefFindKthToTail(head, k):# write code hereif head ==Noneor k==0:#特殊情况1:链表为空或者k=0returnNone
root1 = head
root2 = head
i =0while i < k-1:#root1走到k-1步,第k步两个节点一同开始走
i+=1if root1.next!=None:
root1 = root1.nextelse:returnNone#特殊情况2:链表长度不为Kwhile root1.next!=None:
root1 = root1.next
root2 = root2.nextreturn root2
defprintMatrix(matrix):
res =[]while matrix:
res += matrix.pop(0)#将matrix[0][:]即第一行pop出来,放入res中,此时matrix(3*4)if matrix and matrix[0]:#matrix[:][-1]即最后一列pop出来,接着放入res中,此时matrix(3*3)for row in matrix:
res.append(row.pop())if matrix:
res += matrix.pop()[::-1]#将matrix最后一行pop出来,列表[::-1]倒叙读数,此时matrix(2*3)if matrix and matrix[0]:#matrix[:][0]即第一列pop出来,倒叙接着放入res中,此时matrix(2*2)for row in matrix[::-1]:
res.append(row.pop(0))return res
#法一:循环 *****defVerifySquenceOfBST(sequence):iflen(sequence)==0:returnFalse
length =len(sequence)-1
i =0while length !=0:while sequence[i]< sequence[length]:
i +=1while sequence[i]> sequence[length]:
i +=1if i < length:returnFalse
length -=1
i =0returnTrue#法二:递归classSolution:#判断序列是否是二叉排序树的后续遍历序列 defVerifySquenceOfBST(self, sequence):iflen(sequence)==0:returnFalseiflen(sequence)==1:returnTrue
root=sequence[-1]#根节点的值
border=len(sequence)-1#必须初始化边界点的值,因为有可能没有右子树,就无法按照第一个大于root的方法找到borderfor i inrange(len(sequence)-1):#找出左右子树的分界处if sequence[i]>root:
border=i
breakfor i inrange(len(sequence)-1):#判断左右子树是否都满足条件---边界点左边的值小于root,右边的值大于rootif sequence[i]<root and i>border:returnFalseif sequence[i]>root and i<border:returnFalseif border==len(sequence)-1or border==0:#没有左子树或没有右子树return self.VerifySquenceOfBST(sequence[:-1])else:return(self.VerifySquenceOfBST(sequence[:border])and self.VerifySquenceOfBST(sequence[border:len(sequence)-1]))
defFindPath(self, root, expectNumber):ifnot root:return[]if root andnot root.left andnot root.right and root.val==expectNumber:#没有左右节点,且此节点值为目标值return[[root.val]]
res =[]
left = self.FindPath(root.left,expectNumber-root.val)
right = self.FindPath(root.right,expectNumber-root.val)for i in left+right:
res.append([root.val]+i)#递归时减去的当前节点值此时要加上return res
classSolution:defPermutation(self, ss):iflen(ss)<=0:return[]
res =list()#创建一个空列表,res = []
self.perm(ss,res,'')
uniq =list(set(res))returnsorted(uniq)defperm(self,ss,res,path):if ss=='':#临界条件
res.append(path)else:for i inrange(len(ss)):#print(ss[:i] + ss[i + 1:], res, path + ss[i])
self.perm(ss[:i]+ss[i+1:],res,path+ss[i])#********核心思想!!!#训练过程:"""
bc [] a i=0 因为传入的ss在变,所以里面还有小递归
c [] ab
[] abc
b ['abc'] ac
['abc'] acb
ac ['abc', 'acb'] b i=1
c ['abc', 'acb'] ba
['abc', 'acb'] bac
a ['abc', 'acb', 'bac'] bc
['abc', 'acb', 'bac'] bca
ab ['abc', 'acb', 'bac', 'bca'] c i=2
b ['abc', 'acb', 'bac', 'bca'] ca
['abc', 'acb', 'bac', 'bca'] cab
a ['abc', 'acb', 'bac', 'bca', 'cab'] cb
['abc', 'acb', 'bac', 'bca', 'cab'] cba
"""
import heapq # 利用python的heapq模块,来实现堆的操作classSolution:defGetLeastNumbers_Solution(self, tinput, k):# write code here
maxheap =[]if k <=0or tinput ==Noneorlen(tinput)<k:return[]for i inrange(k):
heapq.heappush(maxheap,-tinput[i])#python自带的heapq模块实现的是最小堆,没有提供最大堆的实现,所以取反为负值for i inrange(k,len(tinput)):if maxheap[0]>-tinput[i]:continueelse:
heapq.heappushpop(maxheap,-tinput[i])#heappushpop(a,x)在弹出最小值之前将x推送到a上
result =[]for i inrange(k):
result.insert(0,-heapq.heappop(maxheap))#一个个弹出堆顶端元素,并保存到列表中return result
2.29 连续子数组的最大和
思想:动态规划
defFindGreatestSumOfSubArray(array):
dp =[array[0]]#初始化第一个位置for i inrange(1,len(array)):
dp.append(max(dp[i-1]+ array[i], array[i]))returnmax(dp)
2.30 整数中1出现的次数
defNumberOf1Between1AndN_Solution(self, n):
count =0for i inrange(n+1):
s =str(i)if"1"in s:
count += s.count("1")return count
2.31 把数组排成最小的数
python2专用的用cmp
defPrintMinNumber(self, numbers):ifnot numbers:return""
lmb =lambda n1, n2:int(str(n1)+str(n2))-int(str(n2)+str(n1))
array =sorted(numbers,cmp=lmb)#python2专用,用cmpreturn''.join([str(i)for i in array])
2.32 丑数
思路: 首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘以2,3,5,就得到2,3,5三个丑数,在从这三个丑数出发乘以2,3,5就得到4,6,10,6,9,15,10,15,25九个丑数,我们发现这种方法会得到重复的丑数,而且我们题目要求第N个丑数,这样的方法得到的丑数也是无序的。那么我们可以维护三个队列:
访问权限是java中一个比较中要的知识点,它规定者什么方法可以访问,什么不可以访问
一:包访问权限;
自定义包:
package com.wj.control;
//包
public class Demo {
//定义一个无参的方法
public void DemoPackage(){
System.out.println("调用
用户自定义聚合函数,用户提供的多个入参通过聚合计算(求和、求最大值、求最小值)得到一个聚合计算结果的函数。
问题:UDF也可以提供输入多个参数然后输出一个结果的运算,比如加法运算add(3,5),add这个UDF需要实现UDF的evaluate方法,那么UDF和UDAF的实质分别究竟是什么?
Double evaluate(Double a, Double b)
在利用tomcat-redis-session-manager做session同步时,遇到了在session保存一个自定义对象时,修改该对象中的某个属性,session未进行序列化,属性没有被存储到redis中。 在 tomcat-redis-session-manager的github上有如下说明: Session Change Tracking
As noted in the &qu
关于Table Driven Approach的一篇非常好的文章:
http://www.codeproject.com/Articles/42732/Table-driven-Approach
package com.ljn.base;
import java.util.Random;
public class TableDriven {
public