A 218ª sessão especial do Alibaba do jogo semanal (apenas os três primeiros são feitos) Analisador de metas de design + número máximo de K pares de soma + números binários consecutivos de conexão

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 ! ! ! ! ! ! ! ! !

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.

Acho que você gosta

Origin blog.csdn.net/qq_45531729/article/details/110742985
Recomendado
Clasificación