Android面試70題
這里整理的都是我在面試過(guò)程遇到的筆試和面試題音诈,基本都參照和對(duì)比了網(wǎng)上的一些解決方案幻碱,修復(fù)了一些bug。有些題的其他解決方案在注釋中有鏈接细溅,希望對(duì)廣大Android戰(zhàn)友們有所幫助褥傍!
/**
* 編寫(xiě)一個(gè)截取字符串的函數(shù),輸入為一個(gè)字符串和字節(jié)數(shù)谒兄,輸出為按字節(jié)截取的字符串摔桦。
* 但是要保證漢字不被截半個(gè)社付,如輸入(“我ABC”承疲,4),應(yīng)該輸出“我AB”鸥咖;
* 輸入(“我ABC漢DEF”燕鸽,6),應(yīng)該輸出“我ABC”而不是“我ABC”+“漢”的半個(gè)
*
* 考點(diǎn):漢字截半時(shí)對(duì)應(yīng)字節(jié)的ASCII碼小于0
*/
public static void main(String[] args) throws Exception {
String src = "我ABC漢DEF";
System.out.println(spiltString(src, 4));
System.out.println(spiltString(src, 6));
}
private static String spiltString(String src, int len) throws Exception {
if (src == null || src.equals("")) {
System.out.println("The source String is null!");
return null;
}
byte[] srcBytes = src.getBytes("GBK");
if (len > srcBytes.length) {
len = srcBytes.length;
}
if (srcBytes[len] < 0) {
return new String(srcBytes, 0, --len);
} else {
return new String(srcBytes, 0, len);
}
}
<br >
/**
* 在實(shí)際開(kāi)發(fā)工作中啼辣,對(duì)字符串的處理是最常見(jiàn)的編程任務(wù)啊研。
* 本題目即是要求程序?qū)τ脩糨斎氲淖址M(jìn)行處理。具體規(guī)則如下:
* a)把每個(gè)單詞的首字母變?yōu)榇髮?xiě)
* b)把數(shù)字與字母之間用下劃線字符(_)分開(kāi)鸥拧,使得更清晰
* c)把單詞中間有多個(gè)空格的調(diào)整為1個(gè)空格
* 例如:
* 用戶輸入:
* you and me what cpp2005program
* 則程序輸出:
* You And Me What Cpp_2005_program
*
* 相關(guān)文章:http://blog.csdn.net/u013091087/article/details/43793149
*/
public static void main(String[] args) {
System.out.println("please input:");
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
scanner.close();
String[] ss = s.split("\\s+"); // \s表示空格党远、\t、\n等空白字符
for (int i = 0; i < ss.length; i++) {
String up = (ss[i].charAt(0) + "").toUpperCase(); // 大寫(xiě)
StringBuffer sb = new StringBuffer(ss[i]);
ss[i] = sb.replace(0, 1, up).toString(); // 首字母替換為大寫(xiě)
Matcher m = Pattern.compile("\\d+").matcher(ss[i]);
int fromIndex = 0;
while (m.find()) {
String num = m.group();
int index = ss[i].indexOf(num, fromIndex);
StringBuffer sbNum = new StringBuffer(ss[i]);
ss[i] = sbNum.replace(index, index + num.length(),
"_" + num + "_").toString();
fromIndex = index + num.length() + 2;
if (ss[i].startsWith("_")) { // 去頭"_"
ss[i] = ss[i].substring(1);
}
if (ss[i].endsWith("_")) { // 去尾"_"
ss[i] = ss[i].substring(0, ss[i].length() - 1);
}
}
}
for (int i = 0; i < ss.length - 1; i++) {
System.out.print(ss[i] + " ");
}
System.out.print(ss[ss.length - 1]);
}
<br >
/**
* 舉1-2個(gè)排序算法富弦,并使用java代碼實(shí)現(xiàn)
*
* 冒泡排序沟娱、插入排序、歸并排序腕柜、基數(shù)排序是穩(wěn)定的排序算法
* 選擇排序济似、快速排序、希爾排序盏缤、堆排序不是穩(wěn)定的排序算法
* 通常情況下快速排序最快砰蠢,冒泡最慢
*
* http://blog.csdn.net/qy1387/article/details/7752973
* http://bbs.chinaunix.net/thread-3582599-1-1.html
*/
public static void main(String[] args) {
int[] array = { 1, 5, 84, 54, 62, 32, 77, 19 };
selectSort(array);
bubbleSort(array);
insertSort(array);
for (int data : array) {
System.out.print(data + " ");
}
}
/**
* 選擇排序
*
* 思路:從位置1開(kāi)始每個(gè)數(shù)與第0個(gè)數(shù)比較,如果比第0個(gè)小則互換唉铜,
* 一輪完成后位置0的數(shù)就是最小的台舱;繼續(xù)從位置2開(kāi)始與位置1的數(shù)比較...
*/
public static void selectSort(int[] a) {
for (int i = 0; i < a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[i]) {
swap(a, i, j);
}
}
}
}
/**
* 冒泡排序
*
* 思路:自上而下相鄰兩個(gè)數(shù)比較,大數(shù)往下沉潭流,小數(shù)網(wǎng)上冒竞惋,
* 一輪完成后最大的數(shù)沉到最底;然后其余的數(shù)重復(fù)操作
*/
public static void bubbleSort(int[] a) {
for (int i = 0; i < a.length - 1; i++) {
for (int j = 0; j < a.length - 1 - i; j++) {
if (a[j] > a[j + 1]) {
swap(a, j, j + 1);
}
}
}
}
/**
* 插入排序
*
* 思路:假設(shè)前面(n-1)[n>=2] 個(gè)數(shù)已經(jīng)是排好順序的幻枉,現(xiàn)在要把第n個(gè)數(shù)插到前面的有序數(shù)中碰声,
* 使得這n個(gè)數(shù)也是排好順序的。如此反復(fù)循環(huán)熬甫,直到全部排好順序
*/
public static void insertSort(int[] a) {
for (int i = 1; i < a.length; i++) {
for (int j = i - 1; j >= 0 && a[j] > a[j + 1]; j--) {
swap(a, j, j + 1);
}
}
}
public static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
<br >
/**
* 請(qǐng)編寫(xiě)一個(gè)多線程程序胰挑,其中一個(gè)線程完成對(duì)某個(gè)對(duì)象的int成員變量的增加操作,
* 即每次加1,另一個(gè)線程完成對(duì)該對(duì)象的成員變量的減操作瞻颂,即每次減1;
* 同時(shí)要保證該變量的值不會(huì)小于0豺谈,不會(huì)大于1,該變量的初始值為0
*/
public class TestThread {
public static void main(String[] args) {
new TestThread().call(new Operation());
}
void call(final Operation op) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
op.add();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
op.sub();
}
}
}).start();
}
}
class Operation {
int i = 0;
public synchronized void add() {
if (i < 1) {
i++;
System.out.println(i);
}
}
public synchronized void sub() {
if (i > 0) {
i--;
System.out.println(i);
}
}
}
持續(xù)更新...