2010-09-02 8 views
9

Me pregunto, ¿cuál es el origen de pedir a los entrevistados que analicen manualmente una cadena como int? (sin depender de ningún casting/conversión de tipo que pueda estar integrado en el lenguaje). ¿Es esta una pregunta estándar, sugerida de un libro o lista o algo así?¿Cuál es el origen de pedir a los entrevistados que analicen manualmente una cadena como int?

¿Alguien más aquí en SO se hizo esta pregunta en particular durante una entrevista? Creo que lo crucé al explicarlo y garabatearlo en el pizarrón, ya que he recibido una oferta de trabajo tentativa :)

A continuación se detalla mi implementación desarrollada en Javascript. Hay algunas facetas ingenuas (por ejemplo, no toma un argumento de radix) a lo siguiente, pero demuestra un algoritmo (más o menos) correcto.

function to_i(strValue) { //named so as to not be confused with parseInt 
    if (typeof strValue !== 'string' || strValue.length === 0) { 
     return Number.NaN; 
    } 

    var tmpStr = strValue; 
    var intValue = 0; 
    var mult = 1; 

    for (var pos=tmpStr.length-1; pos>=0; pos--) { 
     var charCode = tmpStr.charCodeAt(pos); 
     if (charCode < 48 || charCode > 57) { 
      return Number.NaN; 
     } 

     intValue += mult * Math.abs(48-charCode); 
     tmpStr = tmpStr.substr(0, tmpStr.length-1); 
     mult *= 10; 
    } 

    return intValue; 
} 
+2

'tmpStr = tmpStr.substr (0, tmpStr.length-1);' parece un poco innecesario si también invierte-itera sobre 'pos'. –

+0

Tampoco parece manejar números negativos. –

+1

gracias por la crítica !! –

Respuesta

-2

Basado en la evidencia anecdótica de otras respuestas, responderé yo mismo, y acepto lo mismo: esto no parece ser una pregunta de entrevista "enlatada".

+0

Le pregunté por el origen de la pregunta de la entrevista. Nadie lo sabía Tenían muchas opiniones sobre la pregunta, pero nadie sabía el origen. –

0

Nunca he oído hablar de esta pregunta, ya que durante las entrevistas en EE. UU. Siempre me hacían preguntas mucho más difíciles. Desearía que me hicieran una pregunta tan simple.

+0

¿Por qué crees que esta Qs no se solicitó en EE. UU.? – Jack

+0

@Jack: Solo estaba explicando que cuando estuve en EE. UU. Durante las iterviews me hicieron preguntas de codificación más difíciles. Tenía entrevistas de codificación específicas solo en EE. UU., En Italia nunca me habían entrevistado sobre el código, simplemente confiaban en mi título. No veo por qué dieron -2. –

+1

Tal vez es porque a) no respondes la pregunta yb) eres menospreciado –

13

No me han hecho esta pregunta, tampoco.

A primera vista, parece que uno de los "eliminar a los idiotas incompetentes obviamente a cabo tan pronto como sea posible avaid perder un tiempo valioso entrevista" tipo de preguntas.

Pero si se mira más de cerca, de hecho hay algunas cosas muy interesantes en ese país. Por lo tanto, si I eran el pidiendo esa pregunta, esto es lo que estaría buscando:

  • esa pregunta es obviamente estúpida, porque ya es una función de la biblioteca estándar ECMAScript que hace Exactamente eso. Y me gustaría que el entrevistado diga que la pregunta es estúpida, porque de lo contrario son a) zombis sin sentido que siguen estúpidamente las órdenes braindead en lugar de ocuparse de su cerebro, o b) en realidad no saben que la función existe
  • También es obviamente un problema de análisis, y es interesante ver si el entrevistado se acerca más como un problema de la piratería cuerda o un problema formal de análisis sintáctico y la cantidad de sobrecarga de uno u otro enfoque genera. En este caso particular, creo que el hacking de cuerdas es el enfoque correcto, pero aún conduce a una gran pregunta de seguimiento: "Ahora haz lo mismo con un analizador sintáctico de descenso recursivo". Cualquier programador debería poder esbozar el analizador de descenso recursivo para este problema en un par de minutos.
  • Por último, pero no menos importante, esto es obviamente un pliegue sobre los caracteres de la cadena. Ahora, no necesariamente esperaría que un programador novato descubriera por sí mismo este redil, pero si insinúo que hay un pliegue ahí, deberían poder detectarlo ellos mismos, y volver a escribir su solución en forma de pliegue .
  • Y, por supuesto, puede juzgar todas las cualidades generales que este tipo de preguntas le permiten: ¿se detiene el entrevistado y piensa en el problema o comienza a piratearlo? Comienza con requisitos, documentación, especificaciones, ejemplos, pruebas o códigos. ¿Pide aclaración de los casos de esquina (como lo que sucede con la cadena vacía, lo que sucede con una cadena que solo contiene un signo menos y nada más, qué pasa con el espacio en blanco, son cadenas garantizadas que son enteros bien formados, es cero negativo un entero bien formado). ¿Utiliza habitualmente el subconjunto estricto de ES5? ¿Él escribe un código legible?¿Escribe jslint código -Friendly

He aquí un ejemplo de resolver el problema con un pliegue (que en ECMAScript se llama reduce):

"use strict"; 

function toInteger(s) { 
    return s.split('').reverse().reduce(function (n, c, i) { 
     if (c === '-') return -n; 
     return n + (c.charCodeAt(0) - 48) * Math.pow(10, i); 
    }, 0); 
} 

Y esto es un simple analizador sintáctico descendente recursivo que construye el valor sobre la marcha:

"use strict"; 

function toInteger(s) { 
    var input, 
     output = 0, 
     sign = 1, 

     lookahead = function() { 
      return input.charAt(0); 
     }, 

     consume = function() { 
      var res = input.slice(0, 1); 
      input = input.slice(1, input.length); 
      return res; 
     }, 

     isDigit = function (c) { 
      return /[0-9]/.test(c); 
     }, 

     signParser = function() { 
      if (lookahead() === '-') { 
       sign *= -1; 
       consume(); 
      } 
     }, 

     digitParser = function() { 
      if (!isDigit(lookahead())) return false; 
      output *= 10; 
      output += (consume().charCodeAt(0) - 48); 
      return true; 
     }, 

     numberParser = function() { 
      signParser(); 
      while (digitParser()); 
     }; 

    input = s; 
    numberParser(); 
    if (!input.length === 0) return false; 
    output *= sign; 

    return output; 
} 

Como siempre es el caso con este tipo de preguntas de la entrevista, nadie serio esperaría que el entrevistado que acaba de escribir los función s abajo en la pizarra. Especialmente el analizador sintáctico de descenso recursivo. Pero en mi humilde opinión, cualquiera debería ser capaz de esbozar cómo se vería la función. En particular, una de las bellezas de un analizador sintáctico descendente recursivo es que se trata de una transformación muy directa de una gramática libre de contexto en un conjunto de funciones de análisis sintáctico, y un entrevistado debería ser capaz de explicar aproximadamente cómo funciona esa transformación, y qué tipo de funciones de análisis corresponden a qué tipo de construcciones gramaticales.


uf, que es un montón de cosas que usted puede salir de una pregunta tan sencilla!

+0

Nota: escribí ambas funciones primero en Ruby, y solo decidí traducirlas a ECMAScript más adelante, porque eso es lo que mencionó la pregunta. Además, en realidad * no * sé * ECMAScript. Por lo tanto, podría haber algún código no idiomático allí. Si ese es el caso, por favor dígame, así puedo solucionarlo. (O simplemente arréglalo tú mismo). –

+0

Hay mucho más en la programación que en el análisis gramatical, así como la arquitectura tiene mucho más que la masonería simple. (De hecho, conozco a dos grandes arquitectos que no saben nada sobre mampostería ...) –

+0

Esta respuesta es similar a sugerir que se necesita una bomba nuclear para matar una mosca en lugar de un matamoscas. No es necesario demostrar que pueden construir un automóvil desde cero para conducir uno. Incluso si tuviera la perspicacia técnica para dar una respuesta de este tipo, me gustaría pensar que tendría la sensatez de contenerme completamente alienando a mis potenciales futuros gerentes y co-ingenieros, hasta que realmente tenga el trabajo. –

2

Querían poner a prueba tus conocimientos de matemáticas, porque muchos "monos de código" no recibían una educación matemática adecuada.

Un número que se expresa en dígitos $ d_1 d_2 ... d_n $ se puede escribir de esta forma: $ d_1 r^(n - 1) + ... + d_ (n - 1) r^1 + d_n $, donde r es la raíz.

Eso significa, 123 en decimal = $ 1 * 10^2 + 2 * 10^1 + 3 $ mientras que 123 en octal es $ 1 * 8^2 + 2 * 8^1 + 3 $ = 83

function to_i(str, rad) { 
    // the function to transform an ascii code into a number value 
    function dig(c) { 
    if (c >= 48 && c <= 57) { 
     // 0 - 9: as-is 
     return c - 48; 
    } else if (c >= 97 && c <= 122) { 
     // a - z: a means 10, b means 11 and so on until z 
     return 10 + c - 97; 
    } else { 
     return Number.NaN; 
    } 
    } 

    // validate arguments 
    if (str == '' || rad < 2 || rad > 35) return Number.NaN; 
    // strip extra characters and lowercase ("$10" -> "10") 
    var result = str.toLowerCase().match(/^.*?(-?)([a-z0-9]+).*?$/); 
    // break on empty numbers 
    if (result == null || !result[2]) return Number.NaN; 
    // get sign multiplier 
    var sign = (result[1] == '-' ? -1 : 1), val = result[2], num = 0; 
    // num = dv_0 * rad ** n + dv1 * rad ** (n - 1) + ... dv_n * rad ** 0 
    // where dv_n = dig(val.charCodeAt(i)) 
    // and a ** b = a * ... * a, b times 
    // for each digits 
    for (var i = val.length - 1, m = 1; i >= 0; i --, m *= rad) { 
    // get digit value 
    var dv = dig(val.charCodeAt(i)); 
    // validate digit value (you can't put 5 in binary) 
    if (dv >= rad || num == Number.NaN) return Number.NaN; 
    // multiply 
    num += m * dv; 
    } 
    // return 
    return num * sign; 
} 

to_i("ff", 16); 

Éste es compatible con radixes, a significa 10, b significa 11 y así sucesivamente hasta z. Espero que esto funcione.

Cuestiones relacionadas