2015-05-25 4 views
0

Я работаю на вопрос интервью:прописной различные буквы в строке

капитализировать 2-й, 4-й, 8-й, 16-й буквы в строке

вход - «буквы в строке»

выход - "буквы в строке"

Вот мое решение:

public static void main(String[] args) { 
    String input = "letters in a string"; 

    String output = input.substring(0, 1) + input.substring(1, 2).toUpperCase() + input.substring(2, 3) 
      + input.substring(3, 4).toUpperCase() + input.substring(4, 7) + input.substring(7, 8).toUpperCase() 
      + input.substring(8, 15) + input.substring(15, 16).toUpperCase() + input.substring(15); 
    System.out.println(output); 

} 

Есть ли способ обобщить это без жесткого кодирования здесь чисел смещения? В общем, то, что я ищу, - это номер письма, который мы хотим использовать, наша программа должна работать над этим без изменения основной логики и должна быть эффективной и с точки зрения сложности?

+1

делает использование метода/Funcitons –

+0

Если я могу, какую работу вы собеседование, не предположат, что вы знаете, как писать методы? – user1803551

+0

@JunedAhsan, и все же никто здесь не имеет обобщенного 'Capitalize (String s, int index)', какой другой метод 'Capitalize (String s, int [] indices)' мог бы использовать в цикле. Очень простое решение для реализации, очень многоразовое, очень краткое и т. Д. –

ответ

3

Предполагая, что вы хотите установить символ в постоянно растущем диапазоне мощности на 2 (2, 4, 8, 16, 32, 64 ...), вы можете просто использовать цикл.

Проблема заключается в том, String не изменяемые (он не может быть изменен), и вы должны избегать String конкатенации внутри петель, где это возможно (в порядке, в вашем случае, это, вероятно, не имеет большого значения, но это все-таки хорошая практика).

С этой целью вы можете либо конвертировать String в char массив (String#toCharArray()) на или использовать StringBuilder, например ...

String text = "letters in a string"; 
int index = 2; 
StringBuilder sb = new StringBuilder(text); 
while (index < sb.length()) { 
    sb.setCharAt(index - 1, Character.toUpperCase(sb.charAt(index - 1))); 
    index *= 2; 
    System.out.println(index); 
} 

System.out.println(sb.toString()); 

Какие выходы lEtTers in a stRing

+0

избили меня; Я не думал о том, чтобы прыгать на следующий индекс, как это. – Asura

0

Да, вы можете сделать это без жесткого кодирования смещения. Вот пример:

int[] toCaps = new int[]{2, 4, 8, 16}; 
String input = "letters in a string"; 
String newString = ""; 
for(int i = 0; i < input.length(); i++){ 
    boolean b = false; 
    for(int j : toCaps){ 
     if(i == (j-1)){//Subtract 1 since the indexing starts at 0. 
      b = true; 
     } 
    } 
    if(b){ 
     newString += Character.toUpperCase(input.charAt(i)); 
    }else{ 
     newString += input.charAt(i); 
    } 
} 
System.out.println(newString); 

Теперь то, что когда-либо числа в массиве toCaps будет расположение строки, которая преобразуется в верхний регистр.

+0

конкатенация в цикле? 'StringBuilder' будет лучше (хотя это, возможно, не проблема) –

+0

@BenKnoble Я мало знаю о StringBuilders, поэтому я предполагаю, что вы правы. Я просто пытался избежать импорта в основном. – Forseth11

+0

достаточно справедливо. Как я уже сказал, в этом тривиальном примере это не имеет большого значения. Но в общем, следует избегать конкатенации в петле. –

0

Может быть, вы могли бы сделать что-то например

public static String capitalize(String s, int[] array)//array would be the indexes you want to be caps. 
{ 
    char[] stringChars = new char[s.length]; 
    for(int x = 0; x < stringChars.length; x++) 
    { 
    stringChars[x] = s.charAt(x); 
    } 
    String finalString; 
    boolean matches; 
    for(int x = 0; x < stringChars.length; x++) 
    { 
    for(int y = 0; y < array.length; y++) 
    { 
     if(array[y] == x) 
     { 
     matches = true; 
     break; 
     } 
     if(matches == true) 
     stringChars[x] = Character.toUppercase(stringChars[x]); 
     finalString += stringChars[x]; 
    } 
    } 
    return finalString; 
} 

Я не тестировал этот код, и может быть некоторые ошибки, но это может сработать.

0

Как утверждают другие, лучший способ сделать это - написать метод, который вы можете использовать более одного раза. Попробуйте это:

public static String capitalize(String string, int[] caps) { 
    if (caps[caps.length - 1] > string.length()) { 
     return "String not long enough."; 
    } 
    StringBuilder sb = new StringBuilder(string); 
    for (int i : caps) { 
     sb.setCharAt(i - 1, Character.toUpperCase(sb.charAt(i - 1))); 
    } 
    return sb.toString(); 
} 


public static void main(String[] args) { 
    int[] caps = {2, 4, 8, 16}; 
    System.out.println(capitalize("letters in a string", caps)); 
} 
+0

Forseth11 уже предложил аналогичное решение – MadProgrammer

+0

@MadProgrammer, мы все предложили аналогичное решение, так или иначе. –

+0

Так зачем повторять то, что уже было предложено? Я могу считать как минимум 3 различных метода. Вопрос в том, что вы добавили, что другой подобный ответ не был – MadProgrammer

0

Вот я думаю, что лучший способ:

//here index is the nth letter to capitalize, i.e. 2 changes the character 
//at index 1, hence the subtraction 
public String capitalize(String s, int index) 
{ 
    StringBuilder sb = new StringBuilder(s); 
    sb.setCharAt(index - 1, Character.toUpperCase(sb.charAt(index - 1))); 
    return (sb.toString()); 
} 

//indices in the array should the follow the same convention as above 
public String capitalize(String s, int[] indices) 
{ 
    for (int i = 0; i < indices.length; i++) 
    { 
     s = Capitalize(s, indices[i]); 
    } 
    return s; 
} 

Отсюда вызова метода на извлеченной вход прост.

EDIT: После возвращения, чтобы посмотреть на это случайным образом, создание StringBuilder в цикле может быть дорогостоящим, поскольку оно полезно только внутри одного тела метода. Лучшим способом было бы расширить шаблон, чтобы передать ссылку StringBuilder на строку в методах (каким-то частным образом), чтобы избежать создания нового все время.

0

Моя безопасная реализация:

public static String toCapitalizedCase(String givenString) { 
    if(TextUtils.isEmpty(givenString)){ 
     return givenString; 
    } 
    String[] arr = givenString.toLowerCase().split(" "); 
    StringBuffer sb = new StringBuffer(); 

    for (int i = 0; i < arr.length; i++) { 
     sb.append(Character.toUpperCase(arr[i].charAt(0))) 
       .append(arr[i].substring(1)).append(" "); 
    } 
    return sb.toString().trim(); 
} 
Смежные вопросы