如何解决Java中的反向文本
我需要帮助。 我只需要反转文本中的拉丁符号,所有其他符号应留在同一位置。 但是结果还有一些其他的“”。我认为这是因为我在String builder中使用了setLength,但是我不知道如何解决它。
其工作方式示例:
输入:[href*="#"]
输出:Sra1katr#/ g1gl,pl2
这是我的代码:
rta1karS#/ l1gg,lp2
解决方法
此行是错误的根源:
invertedSentece = invertedSentece.append(invertedWord).append(" ");
您在每个词后添加" "
。您根本无法在最后一个单词之后添加它:)
实现这一目标的古老技巧是在单词循环之前引入变量boolean first = true;
,并在单词循环结束时说fitrst = false;
,然后在单词循环的开头插入“”,像这样:
boolean first = true;
for (String word : words) {
if (!first) {
invertedSentece = invertedSentece.append(" ");
}
...
invertedSentece = invertedSentece.append(invertedWord);
first = false;
}
此外,使用字母列表非常低效。通常,答案显然是Set而不是List,但是在这种情况下,您可以简单地编写一个静态方法
private static boolean isInLatinAlphabet(char c) {
return
(c >= 'A' and c <= 'Z') ||
(c >= 'a' and c <= 'z');
}
之所以可行,是因为char是数字类型,并且Java使用UTF-16作为char,Character和String的内部表示形式。
因此,就像ASCII中一样,与EBCDIC中不同,A-Z,a-z和0-9形式的序列。
,请尝试使用此代码,最后参考说明:
输入:afsg%gag thy @ sdg $
输出:gagg%sfa gds @ yht $
代码:
public static void main(String[] args) {
System.out.println("Enter text for reverse");
Scanner scan = new Scanner(System.in);
String text = scan.nextLine();
String alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] alphabetArray = alphabet.toCharArray();
List<Character> alphabetList = new ArrayList<Character>();
for (char c : alphabetArray) {
alphabetList.add(c);
}
String[] words = text.split(" ");
StringBuilder invertedSentece = new StringBuilder(); // We don't need "" to initialize a stringbuilder
for (String word : words) {
StringBuilder invertedWord = new StringBuilder(); // We don't need "" to initialize a stringbuilder// invertedWord.setLength(word.length());
int deleteIndex = 1; // Use an index and increase the counter everytime we find a latin letter
HashMap<Integer,Character> storeLatin = new HashMap<>(); // Creating a hashmap to store latin letters in a
// word
for (int i = word.length() - 1; i >= 0; i--) {
if (alphabetList.contains(word.charAt(i))) {
int c = word.length() - deleteIndex - i;
invertedWord = invertedWord.insert(c,word.charAt(i));
} else {
storeLatin.put(Integer.valueOf(i),Character.valueOf(word.charAt(i)));
deleteIndex++;
}
}
// Loop to read letters from hashmap and add them at the specified index
for (Map.Entry<Integer,Character> item : storeLatin.entrySet()) {
invertedWord.insert(item.getKey().intValue(),item.getValue());
}
invertedSentece = invertedSentece.append(invertedWord).append(" ");
}
System.out.println(invertedSentece.substring(0,invertedSentece.length() - 1));
}
说明:
else语句逻辑有问题。
让我们以abe#hy为例,同时反转我们移动的字符串
y在0索引处 h在1索引 现在我们在索引3处分配#,当前的反向单词为“ yh#”在下一次迭代中,当我们将另一个字母e推入stringbuilder时,它将继续将所有内容推向右侧-“ yhe#”
第二点是在StringBuilder的索引处删除一个字符,然后在所有索引处添加项目,但此索引仍将在我们的结果中保留空白。为避免此问题,我们需要维护一个包含拉丁字母数量的计数器,并使用它来计算其他索引(请参阅deleteIndex变量的使用)。
,public static String reverseOnlyLetters(String str) {
StringBuilder buf = new StringBuilder(str.length());
for (int i = 0,j = str.length() - 1; i < str.length(); ) {
if (j >= 0) {
if (Character.isLetter(str.charAt(j))) {
if (Character.isLetter(str.charAt(i))) {
buf.append(str.charAt(j--));
i++;
} else
buf.append(str.charAt(i++));
} else
j--;
} else
buf.append(str.charAt(i++));
}
return buf.toString();
}
输出:
System.out.println(reverseOnlyLetters("a_bc_DEF_ghij")); // j_ih_gFE_Dcba
System.out.println(reverseOnlyLetters("!@#$%^&*()_+")); // !@#$%^&*()_+
System.out.println(reverseOnlyLetters("afsg%gag thy@sdg$")); // gdsy%htg agg@sfa$
,
我是怎么做到的:
String revers(String inputText) {
List<String> words = new ArrayList<String> (Arrays.asList(inputText.split(" ")));
StringBuilder invertedSentence = new StringBuilder();
for (String word : words){
Map<Integer,Character> storeLetter = new HashMap<Integer,Character>();
int deleteIndex = 1;
StringBuilder invertedWord = new StringBuilder();
for (int i = word.length() - 1; i >= 0; i--)
if (Character.isLetter(word.charAt(i))) {
int c = word.length() - deleteIndex - i;
invertedWord = invertedWord.insert(c,word.charAt(i));
}
else {
storeLetter.put(i,word.charAt(i));
deleteIndex++;
}
for (Map.Entry<Integer,Character> letter : storeLetter.entrySet()) {
invertedWord.insert(letter.getKey().intValue(),letter.getValue());
}
invertedSentence.append(invertedWord);
invertedSentence.append(" ");
}
return invertedSentence.toString().trim();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。