在给应届生审题时,有如下两题,经常难倒各位同学,尤其是第一题,所以在下将个人的理解分享出来,希望大家顺利通过笔试。当然同学们得去理解代码,而不是死记。^.^
package com.jarjar.services;
/**
*
* @author Jiayb
*
*/
public class Test {
public static void main(String[] args) {
getPeach(10);
System.out.println("递归方式:总数="+getPeachs(10));
reverseString("abcdefgh");
}
/**
* 题一:
* 写一个函数reverseStrings(String temp),
* 实现逆转一个字符串的功能(比如输入字符串为:abcdef,则输出为:fedcba)。
*/
public static void reverseString(String str){
//方式一,利用StringBuffer
StringBuffer sb = new StringBuffer(str);
sb.reverse();
System.out.println("StringBuffer方式: "+sb.toString());
//方式二,数组
String revStr = "";
for (int i = str.length(); i >= 1; i--) {
revStr = revStr+str.substring(i-1, i);
}
System.out.println(revStr);
}
/**
* 题二:
* 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,
* 又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
* 以后每天早上都吃了前一天剩下的一半零一个。
* 到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?
*/
/**
* 根据天数计算第一天总共摘了多少桃子
* 递归
*
* @param numOfDays 总天数
* @return 第一天总共摘的桃子数
*/
public static int getPeachs(int days) {
if (days < 1) {
throw new RuntimeException("The days must more than zero!");
}
if (days == 1) {
return 1;
}
return (getPeachs(days - 1) + 1) * 2;
}
/**
* 根据天数计算第一天总共摘了多少桃子
*
* @param numOfDays
* 总天数
* @return 第一天总共摘的桃子数
*/
public static void getPeach(int days) {
// 方法一,逆向求值
int peachs = 1; // 最后一天剩下的桃子
for (int i = days - 1; i >= 1; i--) {// 从总天数的前一天开始,递加到第一天跳出循环
/*
* 下面程序的由来分析: 假如知道总数走正向的话,猴子吃掉的都是前一天剩下的一半桃子然后又多吃一个,即:明天的桃子数 =
* (今天剩余数/2-1)个, 那么算法是--第一天吃掉(peachs/2-1)个,第二天是是(peachs/2-1)/2-1...
* 现在我们知道最后一天剩下的个数,求总数,那么上面的公式反过来,即得到:前一天的桃子数 = (当天剩余数+1)*2
*/
peachs = 2 * (peachs + 1);
}
System.out.println("方式一:总桃子数量" + peachs + "个!");
// 方法二,累加匹对
int peachNum = 0; // 桃子个数
int temp = 0; // 用来匹对的变量
while (true) {
peachNum++;
temp = peachNum; // 将累加的桃子赋值给临时变量,进行运算
// 累加到第十天
for (int i = 1; i < days; i++) {
temp = temp / 2 - 1;
}
if (temp == 1) { // 吃了十天后若按题意剩下一个即满足题意,跳出循环
break;
}
}
System.out.println("方式二:总桃子数量" + peachNum + "个!");
}
}
控制台输出:
方式一:总桃子数量1534个!
方式二:总桃子数量1534个!
递归方式:总数=1534
StringBuffer方式: hgfedcba
hgfedcba