Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

160
Visualizações
Array searching and slicing

Given the string nums that contains only digits and the array of numbers predefinedNumbers, I have to construct a new string, based on nums but where each number between colons has to be a valid number from predefinedNumbers and return all possibilities.

Example input:

nums = "143163421154143"
predefinedNumbers = ["21154", "143", "21154143", "1634", "163421154"]

Desired output:

[ ":143:1634:21154:143:", ":143:163421154:143:", ":143:1634:21154143:" ]

So far I tried this code but it's not the result I need and I'm stuck trying to understand how to go over it recursively:

let nums = "143163421154143";
predefinedNumbers = ["21154", "143", "21154143", "1634", "163421154"];


let newArray=[];
function makeNumSentences (nums, predefinedNumbers) {
    predefinedNumbers.map(item => {
        if (nums.includes(item)) {
            newArray.push(item)
        }
    })
    
    console.log(newArray.join(':'));
        };
        
        
makeNumSentences("143163421154143",["21154", "143", "21154143", "1634", "163421154"])

Any hint is very much appreciated.

about 4 years ago · Santiago Gelvez
2 Respostas
Responde à pergunta

0

Please note that the loops will never end in case the nums is not composed of predefinedNumbers only.

const nums = "143163421154143";
const predefinedNumbers = ["21154", "143", "21154143", "1634", "163421154"];
const result = [];

function makeNumSentences(nums) {
  check([], nums);
  console.log(result);
};

function check(array, nums) {
  predefinedNumbers.forEach(e => {
    if (nums.startsWith(e)) {
      const newArray = array.concat(e);
      const newNums = nums.slice(e.length);
      if (newNums) { check(newArray, newNums); }
      else { result.push(newArray.join(':')); }
    }
  });
}
        
        
makeNumSentences(nums);

about 4 years ago · Santiago Gelvez Relatório

0

First, please read How do I ask and answer homework questions?.

Since there is already an accepted answer, though, I will just show an alternate technique. The fact that the elements are digits is meaningless. This same technique will work for any strings. (There are mathematical techniques to find the right value, but they would quickly overflow normal numbers, and since the output needs to be a string in any case, there seems to be no need to pursue them.)

Thinking about this recursively, we can break this into two pieces. Which of my predefined values appear in the start of my target string? And for each one of those, how do I perform the same operation on the remainder of the string? A recursion needs a base case, and we can say that if the target string is empty, then we can return a single empty string.

We can implement it like this:

const make = (target, sources) =>
  target .length == 0
    ? [[]]
    : sources .filter (s => target .startsWith (s)) 
              .flatMap (s => make (target .slice (s .length), sources) .map (r => [s, ...r]))

const makeNumSentences = (target, parts) => 
  make (target, parts) .map (r => `:${r.join(':')}:`)


const nums = "143163421154143"
const predefinedNumbers = ["21154", "143", "21154143", "1634", "163421154"]

console .log (makeNumSentences (nums, predefinedNumbers))

Notice the breakdown into a main recursive function, which returns an array of arrays of elements from our sources ([["143", "1634", "21154", "143"], ["143", "1634", "21154143"], ["143", "163421154", "143"]]) and a wrapper which combines them into the output format. ([":143:1634:21154:143:", ":143:1634:21154143:", ":143:163421154:143:"]). This is to my mind the proper breakdown of the work. Arrays are nice to work with and we can do much more with them. But this is not the only way to go. We can alter this to return the strings directly:

const make = (target, sources) =>
  target .length == 0
    ? ['']
    : sources 
       .filter (s => target .startsWith (s)) 
       .flatMap (s => make (target .slice (s .length), sources) .map (r => `:${s}${r}` +  (r ? '' : ':')))

const nums = "143163421154143"
const predefinedNumbers = ["21154", "143", "21154143", "1634", "163421154"]

console .log (make (nums, predefinedNumbers))

Note that there is some additional complexity here in building the strings. This is because of the trailing ":". We want to add that only on the first step when the existing string is empty. (We always add the leading one.)

about 4 years ago · Santiago Gelvez Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda