KMP算法
public static int kmpSearch ( String s, String p) {
int sLen = s. length ( ) ;
int pLen = p. length ( ) ;
if ( sLen < pLen) {
return - 1 ;
}
int [ ] next = getNext ( p) ;
int i = 0 , j = 0 ;
while ( i < sLen && j < pLen) {
if ( j == - 1 || s. charAt ( i) == p. charAt ( j) ) {
i++ ;
j++ ;
} else {
j = next[ j] ;
}
}
if ( j == pLen) {
return i - j;
} else {
return - 1 ;
}
}
public static int [ ] getNext ( String p) {
int len = p. length ( ) ;
int [ ] next = new int [ len] ;
next[ 0 ] = - 1 ;
int i = 0 , k = - 1 ;
while ( i < len - 1 ) {
if ( k == - 1 || p. charAt ( i) == p. charAt ( k) ) {
++ k;
++ i;
if ( p. charAt ( i) != p. charAt ( k) ) {
next[ i] = k;
} else {
next[ i] = next[ k] ;
}
} else {
k = next[ k] ;
}
}
return next;
}
LRU
import java. util. HashMap ;
class Node {
public Node ( String key, String value) {
this . key = key;
this . value = value;
}
public Node pre;
public Node next;
public String key;
public String value;
}
public class LRUCache {
private Node head;
private Node end;
private int limit;
private HashMap map;
public LRUCache ( int limit) {
this . limit = limit;
map = new HashMap ( ) ;
}
public String get ( String key) {
Node node = map. get ( key) ;
if ( node == null ) {
return null ;
}
refreshNode ( node) ;
return node. value;
}
public void put ( String key, String value) {
Node node = map. get ( key) ;
if ( node == null ) {
while ( map. size ( ) >= limit) {
String oldKey = removeNode ( head) ;
map. remove ( oldKey) ;
}
node = new Node ( key, value) ;
addNode ( node) ;
map. put ( key, node) ;
} else {
node. value = value;
refreshNode ( node) ;
}
}
private void refreshNode ( Node node) {
if ( node == end) {
return ;
}
removeNode ( node) ;
addNode ( node) ;
}
private String removeNode ( Node node) {
if ( node == end) {
end = end. pre;
} else if ( node == head) {
head = head. next;
} else {
node. pre. next = node. next;
node. next. pre = node. pre;
}
return node. key;
}
private void addNode ( Node node) {
if ( end != null ) {
end. next = node;
node. pre = end;
node. next = null ;
}
end = node;
if ( head == null ) {
head = node;
}
}
}
手动实现一个锁
class Share {
int i;
Lock lock = new ReentrantLock ( ) ;
public void incr ( ) {
lock. lock ( ) ;
try {
i++ ;
}
finally {
lock. unlock ( ) ;
}
}
}
public class MyLock implements Lock {
AtomicReference < Thread > owner = new AtomicReference < > ( ) ;
BlockingQueue < Thread > waiter = new LinkedBlockingDeque < > ( ) ;
@Override
public void lock ( ) {
while ( ! owner. compareAndSet ( null , Thread . currentThread ( ) ) ) {
waiter. add ( Thread . currentThread ( ) ) ;
LockSupport . park ( ) ;
waiter. remove ( Thread . currentThread ( ) ) ;
}
}
@Override
public void unlock ( ) {
if ( owner. compareAndSet ( Thread . currentThread ( ) , null ) ) {
for ( Object object : waiter) {
Thread next = ( Thread ) object;
LockSupport . unpark ( next) ;
}
}
}
链表判环
public class Linked {
private static class Node {
private Integer data;
private Node next;
Node ( ) { }
Node ( Integer data) {
this ( data, null ) ;
}
Node ( Integer data, Node next) {
this . data = data;
this . next = next;
}
}
public static boolean isLoop ( Node head) {
Node singleStep = head. next;
Node doubleStep = head. next. next;
while ( doubleStep != null ) {
Integer num1 = singleStep. data;
Integer num2 = doubleStep. data;
if ( num1 == num2) return true ;
singleStep = singleStep. next;
doubleStep = doubleStep. next. next;
if ( doubleStep == null ) return false ;
}
return true ;
}
public static void main ( String [ ] args) {
Node head = new Node ( ) ;
Node node1 = new Node ( 1 ) ;
Node node2 = new Node ( 2 ) ;
Node node3 = new Node ( 3 ) ;
Node node4 = new Node ( 4 ) ;
Node node5 = new Node ( 5 ) ;
Node node6 = new Node ( 6 ) ;
head. next = node1;
node1. next = node2;
node2. next = node3;
node3. next = node4;
node4. next = node5;
node5. next = node6;
node6. next = node1;
boolean loop = isLoop ( head) ;
System . out. println ( loop) ;
}
}
力扣 子集
package test ;
import java. util. ArrayList ;
import java. util. List ;
class Solution {
public static List < List < Integer > > enumerate ( int [ ] nums) {
List < List < Integer > > res = new ArrayList < > ( ) ;
res. add ( new ArrayList < > ( ) ) ;
for ( int i = 0 ; i < nums. length; i++ ) {
int size = res. size ( ) ;
for ( int j = 0 ; j < size; j++ ) {
List < Integer > list = new ArrayList < > ( res. get ( j) ) ;
list. add ( nums[ i] ) ;
res. add ( list) ;
}
}
return res;
}
}
public class Main {
public static void main ( String [ ] args) {
int [ ] a = { 1 , 2 , 3 } ;
List < List < Integer > > p = Solution . enumerate ( a) ;
System . out. print ( " " + p) ;
}
}
SQL 取班级前三名成绩
select * from tb_student s
where (
exists (
select count ( * ) from tb_student st
where st. score > s. score
and st. class = s. class
group by st. class
having count ( * ) <= 3
)
)
order by
class, score DESC