字符串反转。
好了,既然找不到也不必耿耿于怀了。今天读了《高效能程序员的修炼》第四章,发现自己好烂,如果按照作者的看法,我是无论如何都入不了他的法眼,于是乎,我告诉自己,从零开始,把作者提出的面试题按照Java来写一遍,无论是参考别人还是自己略能想得到的办法,亲自动手把它们敲出来,并且记录下来吧!
写一个函数把字符串反转,作为本系列的开篇,Java自然也有很多种实现方式,相信很多人也都曾做过这样的博客,但是我依然要把这些记录在自己的博客之中,尽我所能掌握它们:
package com.honzh.mwq.reverse;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Stack;
public class Test {
public static void main(String[] args) {
// 第一种,我最先能想得到的,利用下标倒序把字符取出来重组
System.out.println(reverse1("diyizhong"));
// 第二种,我想了半天才想通,我发现我不适合编程了都
// 循环依然是从0到length-1,只不过是将先取出来的放在后取出来的后面
System.out.println(reverse2("dierzhong"));
// 第三种,利用Collections类的反转list的方式,比较麻烦了
System.out.println(reverse3("disanzhong"));
// 第四种,这种比第三种更加简洁一些,不过我自己倒是对Collections的反转方法记忆比较深刻
// 而对于StringBuilder或者StringBuffer的记忆不是很深刻,那么现在我记住了
System.out.println(reverse4("disizhong"));
// 第五种,利用堆栈,所谓的先进后出
// 当然,首先你先从API中了解一下stack吧,它是对vector的扩展,通过push进行放入操作,然后通过pop方法进行弹出
// 我认为stack还是很有必要进行深入的研究,看看源码是怎么扩展的,我一定要掌握
System.out.println(reverse5("diwuzhong"));
// 第六种,是完全copy别人的,我甚至都无法弄明白为什么?我一直觉得自己是一个逻辑痴呆者
// 我不知道自己是怎么经历了漫漫编程生涯的7年时光,包括大学哈,我一直很怀疑我自己能走多远,
// 因为对于第六种的方式,我是想清楚一会过一会就会马上忘记的那种,我很奇怪自己是靠什么活过来的
// 这一直都是我的痛点,我对各种排序算法有点过敏,我内心很厌恶这些排序算法,然而好像学习
// 编程的人必须要了解。否则不配做一个程序员,而我就属于不配的这种。
// 这种做法无非就是先将第一个位置的字符替换成和在位置上对立的字符
// 其关键在于字符串的长度是奇数还是偶数的时候是否依然能够对称处理,显然,这种做法在处理1234的时候会循环两次
// 在处理123的时候也是两次,123的时候会把2作为对称的位置进行处理
// 但是最关键的还在于,其处理次数显然是最有效率的
// 犹记得当时一个面试的应聘者这样把题答出来了,我当时很惭愧,觉得自己无法面对自己的上司,因为我不曾想过还有这样的处理方法
// 这个方式还是很值得好好记住的
System.out.println(reverse6("diliuzhong"));
System.out.println(reverse6("1234"));
System.out.println(reverse6("123"));
}
public static String reverse1(String old) {
String result = "";
for (int i = old.length() - 1; i >= 0; i--) {
result += String.valueOf(old.charAt(i));
}
return result;
}
public static String reverse2(String old) {
String result = "";
for (int i = 0; i < old.length(); i++) {
result = old.charAt(i) + result;
}
return result;
}
public static String reverse3(String old) {
String result = "";
List<String> olds = Arrays.asList(old.split(""));
Collections.reverse(olds);
for (String s : olds) {
result += s;
}
return result;
}
public static String reverse4(String old) {
return new StringBuffer(old).reverse().toString();
// return new StringBuilder(old).reverse().toString();
}
public static String reverse5(String old) {
char[] chars = old.toCharArray();
Stack<Character> oldStack = new Stack<Character>();
for (Character c : chars) {
oldStack.push(c);
}
String result = "";
while (!oldStack.empty()) {
result += oldStack.pop();
}
return result;
}
public static String reverse6(String old) {
char[] chars = old.toCharArray();
int n = chars.length - 1;
for (int i = 0; i <= n / 2; i++) {
char temp = chars[i];
chars[i] = chars[n - i];
chars[n - i] = temp;
}
return new String(chars);
}
}