2010-08-14 6 views
0

Je suivants problème:algorithmes formatage de chaîne suggestion

chaîne Entrée 1: "A [SPACE] B [SPACE] C [SPACE] [SPACE] D [SPACE] [SPACE] E"
chaîne Entrée 2 : « 1- » OU « 1,2 » OR « 3- »

Si l'entrée chaîne 2 est 1 alors je suis censé revenir chaîne de premier mot

Si la chaîne d'entrée est 3 alors i Je suis censé retourner la chaîne du 3ème mot,
Si la chaîne d'entrée est 1,2 alors je suis censé retourner le mot 1 et 2

On ne peut supposer que plus d'un espace est delimiter

Par exemple

3- devrait revenir C [ESPACE] [ESPACE] D [ESPACE] [ESPACE] E

S'IL VOUS PLAÎT examin [ ESPACE] comme caractère d'espace réel

+0

Cela devient très rapidement laid. Qu'en est-il de "4-, 1,2"? Est-ce que cela renvoie "A B D E"? – mlathe

+0

Cela devrait retourner D [ESPACE] [ESPACE], A, B – Avinash

+0

Votre fonction devrait donc renvoyer plusieurs valeurs? – Svante

Répondre

1

Vous n'avez pas dit quelle langue donc ... Java! Il est aki, et suppose que les entrées sont valides, mais probablement un bon point de départ

public void foo(String input, String q) { 
    //First clean up the input string so that all tokens are delimited by one space 
    input = input.replaceAll(" *", " "); 

    String[] inputTokens = input.split(",");  
    String[] queries = q.split(","); 
    for (String query : queries) { 
    if (query.endsWith(-)) { 
     query = query.replace("-", ""); 
     for (int i = Integer.parseInt(query), i <= inputTokens.length; i++) { 
     System.out.println(inputTokens[i]); 
     } 
    } else { 
     System.out.println(inputTokens[Integer.parseInt(query)]); 
    } 
    } 
+0

J'ai d'abord pensé à quelque chose dans ce sens, mais j'ai remarqué que l'OP voulait que plusieurs espaces soient préservés, donc vous ne pouvez pas utiliser les fonctionnalités de type 'string.split' et' string.join'. – ChrisF

+0

En fait l'API est "String [] split (String regex)". Donc vous pouvez faire une regex comme "*", ou quelque chose comme ça. – mlathe

1

Utilisez une expression régulière qui ne correspond qu'à un seul espace (par exemple, quelque chose comme "[^ ] [^ ]") pour trouver les positions sur lesquelles vous devez diviser votre chaîne en tableau ou en une sorte de liste. Retournez ensuite les parties pertinentes de votre tableau.

0

Voici une façon de le faire en Python

import re 

def f(s1,s2): 
    items = re.findall("[^ ]+| +",s1) 
    result = [] 
    for idx in s2.split(','): 
     i,j,_ = idx.partition("-") 
     i=int(i)-1 
     result.append(''.join(items[i:None if j else i+1])) 
    return ','.join(result) 

assert f("A B C D E", "3-") == "C D E" 
assert f("A B C D E", "1,2") == "A,B" 
assert f("A B C D E", "4-,1,2") == "D E,A,B"