开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
这是一个二三线城市的Java岗位的笔试题
公司规模大约30人左右
题目描述为:
买桃子。桃子一元一个,3个桃核儿换一个桃儿。
要求写一个函数,计算n元可以最多吃到多少个桃子,最后还剩下几个桃核儿。并带入100计算出结果
我拿到这个题,眨眼一看,这个题很简单,直接用100/3==33...1,于是就提交了
当时还很骄傲,觉得做的一定对,后来看其他人员都在写,认真想了想不是这么简单。
老哲思考:如果吃了3个桃子,这三个桃子的桃核还能换一个桃子,然后如果吃完这33个桃子,剩33个桃核可以换33/3=11个桃子,所以这本身就是一个递归过程。
递归介绍
递归作为一种算法程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归三要素
递归的终止条件(边界值)
每一次递归的过程
递推函数
明确这些就可以写出此题的正确解法:
这里我先采用暴力法来解答。
import java.util.ArrayList;
import java.util.List;
public class Test01 {
/**
* @Author 李嘉哲
* @param args
* 桃子一元一个,3个桃核儿换一个桃儿。要求写一个函数,
* 计算n元可以最多吃到多少个桃子,最后还剩下几个桃核儿。
*/
public static void main(String[] args) {
test(100);
}
public static void test(int MoneyNum){
//桃子的数量
int num1=0;
//桃核的数量
int num2=0;
List<Integer> list=new ArrayList<>();
num1=MoneyNum;
int i;
//
for (i = 1; i <=MoneyNum; i++) {
if (i%3==0){
list.add(i);
// 每次换成一个桃子时候 桃子数量++
num1++;
}
MoneyNum=num1;
}
System.out.println("桃子的数量为"+num1);
//桃核的数量为 桃子总数-最后一个换桃子的索引位置
num2=num1- list.get(list.size()-1);
System.out.println("桃核的数量为:"+num2);
}
}