java實現字符串反轉技巧,java字符串反轉函數

前言

面試是類似演講演說的過程,網上的資料都是文字的,沒法讓面試者直觀的體驗到面試過程,本人已經將相關內容製作成音頻節目,有興趣的朋友可以去喜馬拉雅搜索《2020年Java面試208題》收聽音頻版節目。

《2020年Java面試208題》整理了208個Java程序員的面試題,主要是針對三年以內開發經驗的JAVA程序員提出的問題。

題目

本期要說的是《2020年Java面試208題》的第8題,面試官提了這樣一個問題:

使用StringBuffer類如何實現字符串反轉:

要求:

1 不要使用reserve方法

2 盡量節省內存的開銷

不需要寫代碼,只要說出思路和理由就可以了。

知識點解析

這個題目看起來簡單,但其中涉及到StringBuffer對字符串管理的內存機制,其實還是值得講一講的。

在演示面試之前,我先說1個知識點,否則可能有些基礎薄弱的看不懂我的回答。

就是StringBuffer中的字符串在內存中是如何管理的?

StringBuffer的字符串,其實就是字符數組,其實也不僅僅StringBuffer是這樣,字符串本身在內存中就是字符數組,也不僅僅Java這麼處理 —- 所有計算機編程語言都是這樣的。

StringBuffer的獨特之處在於,它為了提高字符串操作的性能,採取了空間換時間的策略,它的字符數組的長度並不是字符串的長度,它的字符數組會多分配一些空間,準確地說,StringBuffer默認是申請長度為16的字符數組內存空間,這個空間是在堆內存開闢的。

同時,StringBuffer在操作字符串的時候,如果堆內存中的字符數組長度夠用,就直接使用;如果字符數組的長度不夠了,就新創建一個字符數組,長度為當前字符數組的兩倍,然後將當前字符數組中的內容複製到新字符數組中,然後將舊的字符數組丟棄給垃圾回收。

好,StringBuffer的內存管理的知識點講完了。

再說一下StringBuffer的reserve方法,這個方法就是對字符串進行反轉的,比如字符串為123,reserve後就變成321了。題目要求不使用reserve,那其實就是讓自己寫代碼實現reserve。

這個題其實是從以前C的題目變化過來的,在C語言裡面操作字符串都要自己操作內存實現。Java直接提供了常用的字符串操作方法,面試官為了看出程序員在內存和StringBuffer源代碼的熟悉程度,特意出了這樣的題目。

演示面試

那麼現在就由我來演示一下面試:

你好,面試官。

1 我先說一下我的實現思路。

我會將StringBuffer中管理的字符串,循環取出第1個字符和最後1個字符、第2個字符和倒數第2個字符、第3個字符和倒數第3個字符,然後依次調換,最終就實現了字符串反轉了。

2 這裡有一個問題,兩個字符變量 a 和 b 要想調換值,必須將a的值先賦值給 c,然後將b的值賦值給a,再將c的值賦值給b。這就好像甲乙兩人每人端着一大盆水,他倆想把水盆互相換給對方端着,必須由甲先把水盆放地上,然後甲就空出手來接乙手裡的水盆了,乙把水盆交給甲後,自己騰出手來了才能端起之前甲的那盆水。

所以,兩個字符變量a和b要調換值, 得有一個字符的空間作為字符交換的臨時空間或者叫緩存空間。

一般的方法,都是新創建一個字符變量來作為緩存空間,但本題目要求的是盡量節省內存的開銷,新創建一個字符變量就會在棧里壓入一個這個變量,循環交換字符的過程,就是循環的壓棧出棧的過程,這就會在棧裡面有一個字符的開銷。

3 我考慮的是StringBuffer的特性,StringBuffer寫入字符串的時候,實際內存中的形式的是字符數組,並且申請的內存數組的長度並不是與字符串的長度一樣的,一般都會比字符串的長。那麼我們可以這麼想象一下,比如字符串為 abcdefg,一共7個字符,但StringBuffer在內存中字符數組默認是16個字符的空間 —- 這個是StringBuffer的特性,如此一來,我就可以把字符數組的第8個字符的位置當做是緩存,來完成字符串abcdefg的反轉。

這就是我的思路,我的回答結束了。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/234190.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-11 17:54
下一篇 2024-12-11 17:54

相關推薦

發表回復

登錄後才能評論