面试-编程题

本文解析了两道典型的面试算法题:一是计算n阶乘尾部零的个数的高效算法,二是通过同步机制实现两个线程交替打印奇数和偶数的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试了一个很厉害的大厂,老师让我写了几道题,在此将其记录。

1.设计一个算法,计算出n阶乘中尾部零的个数

样例
11! = 39916800,因此应该返回 2

挑战
O(logN)的时间复杂度
public static long count(long n) {

long result = 0;
long temp = n / 5;

while (temp != 0) {
result += temp;
temp = temp / 5;
}
return result;

2.
两个线程交替打印奇数和偶数
(使用两种方法 1.synchronized 2. 阻塞队列 )
public class ProducerAndConsumer {


public static void main(String[] args) {

PrintEvenNumber printEvenNumber = new PrintEvenNumber();
PrintOddNumber printOddNumber = new PrintOddNumber();

printEvenNumber.start();
printOddNumber.start();


}


private static Integer count = 1;

private static String lock = "lock";


//打印奇数的线程
static class PrintOddNumber extends Thread {

@Override
public void run() {
while (count < 100) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}

synchronized (lock) {
if (isEven(count)) { //如果是偶数
try {
lock.wait(); //需要等待

} catch (InterruptedException e) {
e.printStackTrace();
}
}

//如果能够进行到这里,说明是奇数,可以打印
System.out.println("奇数:" + count);
count++;
lock.notify();

}

}


}
}

//打印偶数的线程
static class PrintEvenNumber extends Thread {

@Override
public void run() {

while (count < 100) {

try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}

synchronized (lock) {
if (!isEven(count)) { //如果是奇数
try {
lock.wait(); //需要等待

} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果能够进行到这里,说明是偶数,可以打印
System.out.println("偶数:" + count);
count++;
lock.notify();
}

}


}
}

//判断是否是偶数的方法
public static boolean isEven(int n) {
return n % 2 == 0;
}


}


//********阻塞队列方式***********//
public class ProducerAndConsumer {


public static void main(String[] args) {

PrintEvenNumber printEvenNumber = new PrintEvenNumber();
PrintOddNumber printOddNumber = new PrintOddNumber();

printEvenNumber.start();
printOddNumber.start();


}


private static Integer count = 1;

static BlockingQueue queue = new ArrayBlockingQueue(100);


//打印奇数的线程
static class PrintOddNumber extends Thread {

@Override
public void run() {
while (count < 100) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}

try {
queue.put(count);
} catch (InterruptedException e) {
e.printStackTrace();
}

//如果能够进行到这里,说明是奇数,可以打印
System.out.println("奇数:" + count);
count++;


}

}

}

//打印偶数的线程
static class PrintEvenNumber extends Thread {

@Override
public void run() {

while (count < 100) {

try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}

try {
queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
//如果能够进行到这里,说明是偶数,可以打印
System.out.println("偶数:" + count);
count++;

}

}


}

//判断是否是偶数的方法
public static boolean isEven(int n) {
return n % 2 == 0;
}


}








最常见的Java面试题大全的程序面试程序,很有影响力的哦!好好珍惜这个资料吧!有Java的常见面试题的冒泡,常见的算法,继承,多态 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装:  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性:  多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值