AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79569347
Accepted
F T
F T
Asked: 2025-04-12 00:45:10 +0800 CST2025-04-12 00:45:10 +0800 CST 2025-04-12 00:45:10 +0800 CST

Reorganize os valores negativos para a esquerda e os valores positivos para a direita em uma matriz

  • 772

Estou acompanhando um tutorial em vídeo de C++ online. Em dado momento, tentei escrever código para o problema descrito no título desta questão. Mais tarde, o instrutor mostrou sua abordagem e não consegui decidir qual código é melhor, pois ambos dão o mesmo resultado.

#include <iostream>
using namespace std;
// Array construction

struct Array {
    int A[10];
    int size;
    int length;
};

void Swap(int *des, int *source) {
    int temp = *des;
    *des = *source;
    *source = temp;
}

Implementação do instrutor:

void Rearrange(Array* arr)
{
    int i = 0;
    int j = arr->length - 1;
    while (i < j) {
        while (arr->A[i] < 0)
            i++;
        while (arr->A[i] >= 0)
            j--;
        if (i < j)
            Swap(&arr->A[i], &arr->A[j]);
    }
}

Minha implementação:

void ArrangeNegativeOnLeft(Array *arr) {
    int i = 0;
    int j = arr->length - 1;
    while (i < j) {
        if (arr->A[i] < 0)
            i++;
        if (arr->A[j] >= 0)
            j--;
        if (i < j) {
            Swap(&arr->A[i], &arr->A[j]);
        }
    }
}

Principal

int main(){
    Array r = { {2,-15, 3,-10,5,6,-44, 55}, 10, 8 };
    //Rearrange(&r);
    ArrangeNegativeOnLeft(&r);

    // Display

    cout << "\n Elements are:\n";
    for (int i = 0; i < arr.length; i++) 
        cout << arr.A[i] << " ";
    cout << endl;
}
c++
  • 1 1 respostas
  • 93 Views

1 respostas

  • Voted
  1. Best Answer
    Loki Astari
    2025-04-12T01:29:56+08:002025-04-12T01:29:56+08:00

    Observações:

    Não gosto de passar ponteiros, mas vamos supor que referências sejam uma classe posterior.

    Não gosto de tipos personalizados Swap()e personalizados Array. Suponha que você esteja aprendendo do zero e ainda não tenha chegado às bibliotecas padrões.

    Olhando o código dos instrutores:

    void Rearrange(Array* arr)
    {
        int i = 0;
        int j = arr->length - 1;
        while (i < j) {
            while (arr->A[i] < 0)
                i++;
            while (arr->A[i] >= 0) // I will assume this is a typo from your and that index is j
                j--;
            if (i < j)
                Swap(&arr->A[i], &arr->A[j]);
        }
    }`
    

    Problemas que tenho:

    while (arr->A[i] < 0)      // If the array does not contain any positive numbers this
                               // will not terminate correctly. So you do need an additional
                               // check to make sure it works:
    
    
    // Solved by this test.
    while (i < j && arr->A[i] < 0)
    

    Vantagens de usar whileo código do instrutor em vez ifdo seu código.

    Usar o ifrather em vez do while não funciona como você imagina. Como você só pula um valor por vez e sempre faz uma troca no final do loop, você pode trocar os valores para o lugar errado. Usando seu código, acontece o seguinte:

    Começar:

     -1 -2 -3 3 2 1                // Skip one place -1, 1 are in correct place.
    

    Primeira iteração:

     -1 2 -3 3 -2 1                // swap the -2 and 2
    

    Segunda iteração:

    -1 -2 -3 3 2 1                 // Swap them back
    

    Terceira Iteração:

    -1 -2 3 -3 2 1                 // Now we move on and swap the 3
    

    Quarta Iteração:

    -1 -2 -3 3 2 1                 // Swap them back
    

    Usando o código do instrutor:

    Início: -1 -2 -3 3 2 1

    Saída.

    • 4

relate perguntas

  • Por que os compiladores perdem a vetorização aqui?

  • Erro de compilação usando CMake com biblioteca [fechada]

  • Erro lançado toda vez que tento executar o premake

  • Como criar um tipo de octeto semelhante a std::byte em C++?

  • Somente operações bit a bit para std::byte em C++ 17?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve