Java面试题从零开始:写一个函数把字符串反转

前言:为了能够找一个代表我从零开始的诗词,我挖空心思去找,然而怎么也找不到一个贴合我心意的,被迫上了度娘也不曾找到。真想把小学一年级的语文课本拿出来好好的通读一遍,肯定能找到答案。

好了,既然找不到也不必耿耿于怀了。今天读了《高效能程序员的修炼》第四章,发现自己好烂,如果按照作者的看法,我是无论如何都入不了他的法眼,于是乎,我告诉自己,从零开始,把作者提出的面试题按照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);
 }

}
时间: 2024-08-25 12:33:51

Java面试题从零开始:写一个函数把字符串反转的相关文章

写一个函数对字符串数组排序,使所有变位词都相邻

题目 写一个函数对字符串数组排序,使得所有的变位词都相邻. 解答 首先,要弄清楚什么是变位词.变位词就是组成的字母相同,但顺序不一样的单词. 比如说:live和evil就是一对变位词.OK,那么这道题目的意思就很清楚了, 它并不要求我们将字符串数组中的字符串按字典序排序,否则我们直接调用STL中的sort 函数就可以了.它要求我们在排序的过程中,按照变位词的准则来排序. 这种情况下,我们还是可以调用sort函数,不过要自己写一个对比函数. 一般情况下我们如果要排序一个长度为n的数组A,我们可以这

面试题--&gt;写一个函数,返回一个数组中所有元素被第一个元素除的结果

1 package com.rui.test; 2 3 import java.util.Random; 4 5 /** 6 * @author poseidon 7 * @version 1.0 8 * @date:2015年10月25日 上午11:12:24 9 * @description: 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果 10 * 陷阱: 11 * 1.循环需要倒着写,为什么? 12 * 想想顺着写循环的结果,第一个元素的值会发生变化门后面再除就会有问

经典笔试题:用C写一个函数测试当前机器大小端模式

“用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 1 #include <stdio.h> 2 3 union test 4 { 5 int a; 6 char b; 7 }; 8 9 int endian_test(void) 10 { 11 union test t1; 12 t1.a = 1; 13 return t1.b; 14 } 15 16 int main(void) 17 { 18 int i =

用JAVA写一个函数,功能如下: 任意给定一组数, 找出任意数相加之后的结果为35(任意设定)的情况

用JAVA写一个函数.功能如下:任意给定一组数,例如{12,60,-8,99,15,35,17,18},找出任意数相加之后的结果为35(任意设定)的情况. 可以递归算法来解: package test1; import java.util.Arrays; public class demo { public static void main(String[] args) { String str = "12,60,-8,99,15,35,17,18,8,10,11,12"; int s

Java-集合(没做出来)第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如: List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Learn”); //此时list 为Hello World Learn reverseL

没做出来 第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Learn”); //此时list 为Hello World Learn reverseList(list); //调用reverseList 方法之后,list 为Learn World Hello package

【源码】用1,2,2,3,4,5这六个数字,写一个函数,打印出所有不同的排序,要求:4不能放在第三位,3与5不能相连(C语言实现)

帮朋友做的,好像是一个面试题.暴力方式. #include <stdio.h> #include <stdlib.h> #include <string.h> //判断这个数是不是由1.2.2.3.4.5几位数字组成 int func(int n) { int a[5] = {0}; for(int i = 0; i < 6; i++) { int bit = n % 10; n /= 10; switch(bit) { case 1: a[0]++; break

从零开始写一个arm下的裸板程序

从零开始写一个arm下的裸板程序.我们整个程序是基于uboot运行的. 所有我们可以借助uboot中的printf来输出,默认开发版的标准输出是串口. 电脑的默认标准输出的屏幕. 1.需要创建的文件由include文件夹,用来存放头文件. 2.创建一个hw.h头文件. 3.编写一个common.h,它定义了借用uboot的printf的宏.和NULL这个宏的定义. 4.hw.c 硬件相关的文件. 5.main.c c文件. 6.start.s 汇编文件. 7.ld.lds 链接脚本, 8.Mak

c语言:写一个函数建立一个有3名学生数据的单向动态链表

写一个函数建立一个有3名学生数据的单向动态链表. 解:程序: #include<stdio.h> #include<stdlib.h> #define LEN sizeof(struct Student) struct Student { long num; float score; struct Student *next; }; int n; struct Student *creat(void)//定义函数返回一个指向链表头的指针 { struct Student *head

写一个函数实现数组中的元素随机乱序排序

//原生JS写一个函数实现一个shuffle方法,将数组中的元素随机乱序排序 var shuffle = function(arr){ var len,t,rand; for(var i =0;len = arr.length,i<len;i++){ rand = parseInt(Math.random()*len);//parseInt(Math.random()*(len-1-0)+1);或者rand = Math.floor(Math.random()*(len-1-0)+1);即Mat