Fonte: LeetCode Link: https://leetcode-cn.com/problems/goal-parser-interpretation
Declaração: Se eu violar os direitos de alguém, entre em contato comigo e irei excluí-lo
. Especialistas podem me espalhar
O código do Grande Deus vem de argnote . Na competição desta semana, Java alcançou os cinco primeiros resultados (quarto), incrível ! ! ! ! ! ! ! ! !
Artigo Diretório
5617. Analisador de metas de design
Projete um analisador de metas que possa interpretar o comando de string. comando é composto de "G", "()" e / ou "
(al)" em uma determinada ordem. O analisador de metas interpretará "G" como a string "G", "()" como a string "o" e "(al)" como a string "al". Em seguida, concatene as cadeias de caracteres interpretadas em uma cadeia de caracteres na ordem original.
Fornece o comando string e retorna o resultado da interpretação do comando pelo analisador Goal.
Exemplo 1:
Input: command = "G () (al)"
Output: "Goal"
Explicação: Goal As etapas do analisador para interpretar o comando são as seguintes:
G -> G
() -> o
(al) -> al
last connection O resultado é "Goal"
A simulação de travessia usada diretamente pelo meu código:
class Solution {
public String interpret(String command) {
char[] chs = command.toCharArray();
int len = chs.length;
int i=0;
StringBuffer sb = new StringBuffer();
while(i<len){
if(chs[i]=='('){
if(chs[i+1]=='a'){
sb.append("al");i++;i++;i++;i++;
}else if(chs[i+1]==')'){
sb.append('o');i++;
}
}else if(chs[i]=='G'){
sb.append('G');i++;
}else i++;
}
return sb.toString();
}
}
Consulte o código do Grande Deus e use replaceAll () diretamente
public String interpret(String command) {
return command.replaceAll("\\(\\)", "o").replaceAll("\\(al\\)", "al");
}
Aqui estão alguns usos de replaceAll:
- Substitua os números na string:
String str = "ab123sdab4543das756as876asd";
str = str.replaceAll ("\ d +", "# num #"); // "\ d +",
produza qualquer número de caracteres : ab # num # sdab # num # das # num # as # num # asd
ou:
str = str.replaceAll ("[0-9] +", "# num #"); é o mesmo resultado - Substitua qualquer string não especial:
String regex = "(wqnmlgb | shuai | mei | rnmb | com | db | djb)";
String message = "wqnmlgb! Por que você é tão mei! Com! Você é realmente shuai";
mensagem = mensagem .replaceAll (regex, "***");
Resultado: ***! Por que você é tão ***! ***! Você é realmente *** - Substituir. Símbolo de ponto
String classFile = "com.jd.beijing". ReplaceAll ("\.", " ") + "MyClass.class";
saída: com jd beijingMyClass.class
Se nenhum caractere de escape for adicionado:
String classFile = " com.jd.beijing ". replaceAll (". "," ”) +" MyClass.class ";
output: ************** MyClass.class - Substituir \ caractere
String str1 = "aa \ bbb", str2 = "aa'bbb";
System.out.println (str1); // Saída: aa \ bbb
str1 = str1.replaceAll ("\\", "-" );
System.out.println (str2); // Saída: aa-bbb
str2 = str2.replaceAll ("'", “\\”);
System.out.println (str2); // Saída: aa \ bbb
O método replaceAll () de String, na verdade, usa regras de expressão regular para corresponder. \\, java analisa como \ e fornece para a expressão regular. A expressão regular passa por outra conversão para ser convertida em \
5618. O número máximo de K pares de soma
Fornece uma matriz de números inteiros e um inteiro k.
Em cada etapa da operação, você precisa selecionar dois inteiros cuja soma é k da matriz e movê-los para fora da matriz.
Retorna o número máximo de operações que você pode realizar na matriz.
Exemplo 1:
Entrada: nums = [1,2,3,4], k = 5
Saída: 2
Explicação: nums = [1,2,3,4] no início:
- Mova 1 e 4, depois nums = [2,3]
- Após remover 2 e 3, nums = []
não tem mais um par de números com uma soma de 5, portanto, a operação pode ser realizada no máximo 2 vezes.
Exemplo 2:
Entrada: nums = [3,1,3,4,3], k = 6
Saída: 1
Explicação: No início, nums = [3,1,3,4,3]:
- Depois de remover os dois primeiros 3s, após nums = [1,4,3],
não há mais pares com a soma de 6, então a operação é realizada no máximo uma vez.
提示:
1 <= nums.length <= 105
1 <= nums [i] <= 109
1 <= k <= 109
A simulação que eu mesmo usei,
Use Map <Integer, List> para registrar a lista de subscritos onde cada número aparece e, em seguida, percorra os números da matriz e exclua o correspondente da lista. Preste atenção à situação em que dois números são iguais e a soma é igual a K . Desta vez, apenas manipule uma lista
public int maxOperations(int[] nums, int k) {
Map<Integer, List<Integer>> map = new HashMap<>();
//将下标存进对应的list中
for(int i=0;i<nums.length;++i){
if(!map.containsKey(nums[i])){
map.put(nums[i],new ArrayList<Integer>());
}
map.get(nums[i]).add(i);
}
int ret = 0;
for(int i=0;i<nums.length;++i){
int t = k-nums[i];
List<Integer> list = map.get(nums[i]);
//如果 k-nums[i] = nums[i],只能操作一个list两次
if(t==nums[i]){
if(list.size()>=2){
ret ++;
list.remove(list.size()-1);
list.remove(list.size()-1);
}
}else{
//否则就操作两个list,每个list都减去1
if(list.size()>0){
if(map.containsKey(t)){
List<Integer> tmp = map.get(t);
if(tmp.size()>0){
ret ++;
tmp.remove(tmp.size()-1);
list.remove(list.size()-1);
}
}
}
}
}
return ret;
}
Código de Deus:
Deve ser uma ideia semelhante, mas não há registro de subscritos, mas sim do número de números registrados.
- Se k-num e num não forem iguais, adicione diretamente count + (o número mínimo de ocorrências de num, k-num)
- Se k-num e num forem iguais, conte + (número de ocorrências de num / 2) porque os números aparecem em pares. Por exemplo, o número de ocorrências de num = 3 é 4, k = 6, então k-num = num, cout + 4/2, porque (3,3), (3,3) estão em pares
- O último num e k-num contados devem ser removidos de mao
public int maxOperations(int[] nums, int k) {
//用map记录数字出现的个数
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
int count = 0;
for (int num : nums) {
if (map.containsKey(num) && map.containsKey(k - num)) {
count += Math.min(map.get(num), map.get(k - num)) / (num == k - num ? 2 : 1);
map.remove(num);
map.remove(k - num);
}
}
return count;
}
5620. Conecte números binários consecutivos
Dê a você um inteiro n. Concatene as representações binárias de 1 an e retorne o resultado do par de dígitos decimais 10 ^ 9 + 7 que corresponde ao resultado concatenado.
Exemplo 1:
Entrada: n = 1
Saída: 1
Explicação: "1" no sistema binário corresponde a 1 no sistema decimal.
Exemplo 2:
Entrada: n = 3
Saída: 27
Explicação: Em binário, 1, 2 e 3 correspondem a "1", "10" e "11" respectivamente.
Conectando-os por sua vez, obtemos "11011", que corresponde a 27 em decimal.
Exemplo 3:
Entrada: n = 12
Saída: 505379714
Explicação: O resultado da conexão é "110111001011101111110001001101010111100".
O número decimal correspondente é 118505380540.
Depois de tirar o restante de 109 + 7, o resultado é 505379714.
Dica:
1 <= n <= 10 ^ 5
Meus pensamentos:
Tome 3 como exemplo: n = 1,2,3,
ou seja,
1,10,11, que são respectivamente 1.110.11011 quando unidos.
Pode-se ver que quando n = 2, n = 1, move dois bits à esquerda e adicionar 2, n = 3, n = 2 deslocar para a esquerda em três
dígitos e, em seguida, adicionar 3. Pode ser visto que quando n = N, n = N-1 precisa deslocar para a esquerda em N (dígitos binários) bits e, em seguida, adicione N ...
public int concatenatedBinary(int n) {
//int bitcount = bitcount(n);
//System.out.println(bitcount);
//这里偷懒了,用long来定义ret,避免平移是产生溢出,
long ret = 1L;
for(int i=2;i<=n;++i){
int bitcount = bitcount(i);
ret = (ret << bitcount) + i;
ret = ret % 1000000007;
}
return (int)ret;
}
//n的二进制有多少位,比如n=3有3位,n=12时有4位
public int bitcount(int n){
int ret = 1;
while(n / 2 != 0){
ret++;
n /= 2;
}
return ret;
}
A operação de bit diretamente usada no código do Grande Deus ,,,, Operação de bit ,,, Bit ,,,
Eu ainda mordo, merda, é tão perfumado! ! ! ! Então eu adicionei um bit.//Explanation
public int concatenatedBinary(int n) {
//用long是为了避免在移位的时候产生溢出的麻烦
long size = 0, result = 0;
for (int i = 1; i <= n; i++) {
//这里的(i & (i - 1)是为了计算左移的位数
//遍历到10时,因为之前是1,size=1,所以要size+1
//遍历到100时,之前是01,11,size=2,所以size+1
//1到10,位数加一, 11到100位数加一, 111到1000位数加一。。。。
if ((i & (i - 1)) == 0) {
size += 1;
}
//size计算出来之后,就是result左移size位,然后加i,这里的 | 按位或的操作相当于加法了,比如,3(11)向左移动2位后,是1100,再和2(10)或,就成了1110,相当于加法了
result = ((result << size) | i) % 1000000007;
}
return (int) result;
}
5619. Incompatibilidade mínima (não consegui e não consegui entender a solução, só fiz o portador do problema)
Fornece uma matriz de números inteiros e um inteiro k. Você precisa dividir este array em k subconjuntos do mesmo tamanho para que não haja dois elementos idênticos no mesmo subconjunto.
A incompatibilidade de um subconjunto é a diferença entre os valores máximo e mínimo do subconjunto.
Retorne a soma mínima da incompatibilidade de cada subconjunto após dividir a matriz em k subconjuntos. Se não puder ser dividida em k subconjuntos, retorne -1.
A definição de um subconjunto é uma coleção de alguns números na matriz e não há requisitos para a ordem dos números.
Exemplo 1:
Entrada: nums = [1,2,1,4], k = 2
Saída: 4
Explicação: A distribuição ótima é [1,2] e [1,4].
A soma da incompatibilidade é (2-1) + (4-1) = 4.
Observe que [1,1] e [2,4] podem obter uma soma menor, mas o primeiro conjunto possui 2 elementos idênticos, portanto não é viável
Exemplo 2:
Entrada: nums = [6,3,8,1,3,1,2,2], k = 4
Saída: 6
Explicação: A alocação de subconjunto ideal é [1,2], [2,3], [6,8] e [1,3].
A soma da incompatibilidade é (2-1) + (3-2) + (8-6) + (3-1) = 6.
Exemplo 3:
Entrada: nums = [5,3,3,6,3,3], k = 3
Saída: -1
Explicação: Não há como atribuir esses números a 3 subconjuntos e satisfazer que não há o mesmo número em cada subconjunto.