1.判断一个数的数字计数是否等于数位的值
public boolean digitCount ( String num) {
Map < Integer , Integer > map = new HashMap < > ( ) ;
for ( int i = 0 ; i < num. length ( ) ; i++ ) {
if ( ! map. containsKey ( Integer . parseInt ( num. substring ( i, i+ 1 ) ) ) ) {
map. put ( Integer . parseInt ( num. substring ( i, i+ 1 ) ) , 1 ) ;
} else {
map. put ( Integer . parseInt ( num. substring ( i, i+ 1 ) ) , map. get ( Integer . parseInt ( num. substring ( i, i+ 1 ) ) ) + 1 ) ;
}
}
for ( int i = 0 ; i < num. length ( ) ; i++ ) {
int cntNum = Integer . parseInt ( num. substring ( i, i + 1 ) ) ;
if ( ! map. containsKey ( i) ) {
if ( cntNum != 0 ) {
return false ;
} else {
continue ;
}
}
if ( map. get ( i) != cntNum) {
return false ;
}
}
return true ;
}
2.最多单词数的发件人
public String largestWordCount ( String [ ] messages, String [ ] senders) {
Map < String , Integer > map = new HashMap < > ( ) ;
PriorityQueue < MessageInfo > heap = new PriorityQueue < > ( ( a, b) -> {
if ( a. num != b. num) {
return - a. num. compareTo ( b. num) ;
} else {
return - a. sender. compareTo ( b. sender) ;
}
} ) ;
for ( int i = 0 ; i < senders. length; i++ ) {
int length = messages[ i] . split ( " " ) . length;
if ( ! map. containsKey ( senders[ i] ) ) {
map. put ( senders[ i] , length) ;
} else {
map. put ( senders[ i] , map. get ( senders[ i] ) + length) ;
}
}
for ( Map. Entry < String , Integer > entry : map. entrySet ( ) ) {
MessageInfo messageInfo = new MessageInfo ( ) ;
messageInfo. sender = entry. getKey ( ) ;
messageInfo. num = entry. getValue ( ) ;
heap. add ( messageInfo) ;
}
MessageInfo result = heap. peek ( ) ;
return result. sender;
}
public static class MessageInfo {
public String sender;
public Integer num;
}
3.道路的最大总重要性
public long maximumImportance ( int n, int [ ] [ ] roads) {
Map < Integer , Long > map = new HashMap < > ( ) ;
PriorityQueue < Long > heap = new PriorityQueue < > ( ( a, b) -> - a. compareTo ( b) ) ;
for ( int i = 0 ; i < roads. length; i++ ) {
if ( ! map. containsKey ( roads[ i] [ 0 ] ) ) {
map. put ( roads[ i] [ 0 ] , 1L ) ;
} else {
map. put ( roads[ i] [ 0 ] , map. get ( roads[ i] [ 0 ] ) + 1L ) ;
}
if ( ! map. containsKey ( roads[ i] [ 1 ] ) ) {
map. put ( roads[ i] [ 1 ] , 1L ) ;
} else {
map. put ( roads[ i] [ 1 ] , map. get ( roads[ i] [ 1 ] ) + 1L ) ;
}
}
for ( Map. Entry < Integer , Long > entry : map. entrySet ( ) ) {
heap. add ( entry. getValue ( ) ) ;
}
long result = 0 ;
while ( ! heap. isEmpty ( ) ) {
Long cnt = heap. poll ( ) ;
result += cnt * n;
n-- ;
}
return result;
}
4.以组为单位订音乐会的门票
class BookMyShow {
private int [ ] [ ] site;
private int [ ] restNum;
private int n;
private int m;
private int [ ] preAll;
public BookMyShow ( int n, int m) {
restNum = new int [ n] ;
this . preAll = new int [ n] ;
preAll[ 0 ] = m;
for ( int i = 0 ; i < n; i++ ) {
restNum[ i] = m;
if ( i != 0 ) preAll[ i] = preAll[ i- 1 ] + m;
}
this . n = n;
this . m = m;
}
public int [ ] gather ( int k, int maxRow) {
for ( int i = 0 ; i < n && i <= maxRow; i++ ) {
if ( restNum[ i] >= k) {
int cntN = i;
int cntM = m - restNum[ i] ;
restNum[ i] -= k;
for ( ; i < n; i++ ) {
preAll[ i] -= k;
}
return new int [ ] { cntN, cntM} ;
}
}
return new int [ ] { } ;
}
public boolean scatter ( int k, int maxRow) {
int rest;
int i = 0 ;
boolean flag = false ;
for ( ; i <= maxRow; i++ ) {
if ( preAll[ i] >= k) {
flag = true ;
break ;
}
}
if ( ! flag) {
return false ;
}
rest = preAll[ i] - k;
restNum[ i] = rest;
for ( int j = 0 ; j < i; j++ ) {
preAll[ j] = 0 ;
restNum[ j] = 0 ;
}
preAll[ i] = restNum[ i] ;
for ( int j = i+ 1 ; j < n; j++ ) {
preAll[ j] -= k;
}
return true ;
}
}