算法面试常考知识点

笔试面试准备合集

算法面试常考知识点
计算机网络面试常考知识点
Linux面试常考知识点
操作系统面试常考知识点
C/C++面试常考知识点

链表算法

链表算法经典十题总结
链表反转
如何实现链表的逆序
链表中环的入口结点
在时间复杂度O(1)内删除单链表节点

十大排序算法

程序员必学十大经典排序算法

动态规划(找零钱、最长公共子序列、最长公共子串等)

动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串)

字符串算法

手写函数strlen strcpy strstr等函数
算法面试相关(leetcode)–字符串

计算一字符串s中最大连续相同的字符数
写一个函数,计算字符串 s中最大连续相同的字符个数。例如,若s 为"aaabbbb",则返回值为4;若s为"abcde",则返回值为1。

思路:先定义两个指针p和q同时指向字符串s,定义一个计数器count和最大值max,指针p用来遍历字符串,指针q用于定位需要比较的字符,比如字符串“aaabbbb”,指针p和q一开始指向字符串首地址,也就是a,引用p和q来比较,if(*p==*q),若相同,count++,每次count++后都要比较和max的值(为了把最大值赋给max),p往后移(p++)继续比较,直到遇到不相同的字符,此时,count置为0,q重新从p的位置开始定位(即q要指向p),p继续往后比,重复上述动作,直到遍历完字符串。

#include <stdio.h>
#include <string.h>
 
/*	求字符串中最大连续相同的字符数	*/
int  max_same_char( char* s)
{
	char *p = s;
	char *q = s;
	int count = 0;		//计数器,用于计数每次比较不同字符的连续相同数
	int max = 0;		//最终的最大连续相同的字符数
 
	if(s == NULL)
		return 0;
	while(*p != '\0')
	{
		if(*p == *q)	//如果相等则继续往后判断
		{
			count++;
			p++;
			if(max <= count)	//把比较过程中count最大的值赋给max
			max = count;
		}
		else			//不相等则清空计数器,从不相同的位置继续往后判断
		{
			count = 0;
			q = p;
		}
	}
 
	return max;
}
 
int main(int argc, char const *argv[])
{
	char buf[20];
	printf("请输入一个字符数组:");
	scanf("%s",buf);
	char *p = buf;
	printf("max = %d\n",max_same_char(p));
	return 0;
}

未完待续…

<think>好的,我现在需要处理一个用户关于Java软件开发面试常见知识点的问题。首先,用户明确提到想要了解常考的问题和知识点总结,并且之前的引用材料中有提到JRE、static关键字、final、equals与==的区别等内容。我需要根据这些信息组织一个结构清晰的回答,同时生成相关问题。 首先,我要确保覆盖Java面试的核心知识点。根据引用内容,基础概念如JDK和JRE的区别、static和final关键字、堆与栈的区别、==和equals的区别都是必须包含的。然后,面向对象部分可能包括多态、抽象类与接口、重载与重写。集合框架也是重点,比如ArrayList和LinkedList的区别、HashMap的工作原理。异常处理、多线程、JVM内存模型以及设计模式也是常见的考点。 接下来,我需要检查每个知识点是否符合引用中的内容。例如,在解释static关键字时,要提到它用于修饰类成员,属于类级别,不能被覆盖,同时private方法默认是final的,这些在引用[1]和[2]都有提到。在equals和==的区别时,引用[2]详细说明了基本类型和引用类型的比较方式,以及equals方法的重写影响,这些需要准确反映在回答中。 然后要考虑如何组织这些内容,使其结构清晰。分点列出每个主题,每个主题下再细分小点,比如基础概念、面向对象、集合框架等。每个小点用简短的说明,必要时举例或代码片段。例如,在解释单例模式时,提供一个简单的代码示例会更有帮助。 同时,用户要求生成相关问题,我需要根据每个知识点设计相关问题,确保问题覆盖主要考点,并且能够引导进一步学习。例如,关于HashMap的工作原理、synchronized和ReentrantLock的区别、JVM内存模型等。 最后,要确保回答符合格式要求:行内公式用$...$,独立公式用$$...$$,但考虑到Java面试问题可能较少涉及数学公式,这部分可能不需要太多处理。代码块需要用```python或```java,但根据用户提供的示例,之前的代码是Python,但用户的问题是Java,所以需要调整为Java代码块,比如单例模式的示例。 检查是否有遗漏的重要知识点,比如垃圾回收机制、Java 8新特性如lambda表达式和Stream API,这些在面试中也经常被问到,需要补充进去。同时,设计模式部分除了单例,工厂模式和观察者模式也是常见的,可以提及。 确保所有引用内容正确标注,例如在提到static关键字和final作用时,引用[1]和[2]中的相关内容。同时,保持语言简洁,避免冗长,但信息要全面。最后生成的相关问题需要与回答中的知识点对应,帮助用户深入理解每个部分。</think># Java软件开发面试核心知识点解析 ## 一、基础概念与语法 1. **JDK与JRE的区别** - JDK(Java Development Kit)包含编译器、调试器等开发工具 - JRE(Java Runtime Environment)包含JVM和核心类库,只能运行Java程序[^1] 2. **static关键字** - 修饰类成员(变量/方法),属于类级别而非对象级别 - static方法不能被子类覆盖,可通过`类名.方法`直接调用 - private方法隐式声明为final[^1][^2] ```java class Utility { static int count; // 类变量 public static void printCount() { System.out.println(count); } } ``` 3. **final关键字** - final变量:声明时必须初始化,值不可修改 - final方法:禁止子类重写 - final类:禁止被继承[^2] $$ \text{final变量定义示例:} \quad final\ int\ MAX\_VALUE = 100; $$ ## 二、面向对象编程 1. **多态实现机制** - 编译时多态:方法重载(同名不同参) - 运行时多态:方法重写+继承体系 2. **抽象类 vs 接口(Java 8+)** | 特性 | 抽象类 | 接口 | |--------------|----------------------|----------------------| | 成员变量 | 任意类型 | 默认public static final | | 构造方法 | 有 | 无 | | 默认方法 | Java 8支持 | Java 8支持 | ## 三、集合框架 1. **ArrayList vs LinkedList** - 随机访问:$O(1)$ vs $O(n)$ - 插入删除:末尾$O(1)$,中间$O(n)$ vs 指定位置$O(1)$ 2. **HashMap工作原理** - 数组+链表/红黑树结构(JDK8+) - 负载因子默认0.75,扩容阈值=容量*负载因子 - 哈希冲突解决:拉链法 ## 四、并发编程 1. **线程创建方式** - 继承Thread类 - 实现Runnable接口 - 实现Callable接口+FutureTask 2. **synchronized锁优化** - 偏向锁→轻量级锁→重量级锁的升级过程 - 锁消除、锁粗化等编译器优化 ```java // 双重检查锁定单例模式 public class Singleton { private volatile static Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` ## 五、JVM核心机制 1. **内存模型** - 方法区(元空间):类信息、常量池 - 堆:对象实例 - 栈:局部变量、方法调用 - 程序计数器:线程执行位置 2. **垃圾回收算法** - 标记-清除:产生内存碎片 - 复制算法:适合新生代 - 标记-整理:适合老年代 ## 六、设计模式 1. **单例模式** - 饿汉式:类加载时初始化 - 懒汉式:双重检查锁定+volatile 2. **工厂模式** - 简单工厂:通过参数创建不同对象 - 抽象工厂:创建产品族
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值