PS:《剑指offer》是很多同学找工作都会参考的一本面试指南,同时也是一本算法指南(为什么它这么受欢迎,主要应该是其提供了一个循序渐进的优化解法,这点我觉得十分友好)。现在很多互联网的算法面试题基本上可以在这里找到影子,为了以后方便参考与回顾,现将书中例题用Java实现(第二版),欢迎各位同学一起交流进步。
GitHub: https://github.com/Uplpw/SwordOffer。
剑指offer完整题目链接: https://blog.csdn.net/qq_41866626/article/details/120415258
1 题目描述
为自定义类添加赋值运算符函数。
2 思路
该题使用C++语言实现更加合适,因为Java不支持用户自定义操作符重载(尴尬了~)。不过流程以及细节都是一样的。下面是在实现时需要注意的四个细节:
(1)返回类型为该类型的引用类型。
(2)传入参数是不变的,需要使用常量引用,在Java即用 final 进行修饰。
(3)释放本实例内存(Java自带gc,故不需要主动释放内存,可以忽略)
(4)首先判断传入实例与本实例是否为同一个(在Java中需要分为引用相等、引用不等但值相等来判断),是则直接返回本实例引用,否则赋值再返回本实例引用。
3 代码
上面也说了Java不支持用户自定义操作符重载,所以只能依赖类中方法实现赋值运算。
以下是样例实现(有些缺陷,不能达到连续赋值的效果,即如果是a=b=c,该实现是不能让b拿到c的值):
public class MyAssignment {
private String data;
public MyAssignment(String data) {
this.data = data;
}
// 注意传入参数final修饰符,以及传入引用与当前引用的比较,不需要主动释放内存,返回类型为引用类型
public MyAssignment assign(final MyAssignment another) {
if (this == another || this.data.equals(another.data))
return this;
else {
this.data = another.data;
return this;
}
}
@Override
public String toString() {
return "data=" + data;
}
public static void main(String[] args) {
MyAssignment str1 = new MyAssignment("111");
MyAssignment str2 = new MyAssignment("222");
MyAssignment str3 = new MyAssignment("333");
str1.assign(str2).assign(str3);
System.out.println("str1:" + str1.data);
System.out.println("str2:" + str2.data);
System.out.println("str3:" + str3.data);
}
}
运行结果:
str1:data=333
str2:data=222
str3:data=333
参考
在解决本书例题时,参考了一些大佬的题解,比如leetcode上的官方、K神,以及其他的博客,在之后的每个例题详解后都会给出参考的思路或者代码链接,同学们都可以点进去看看!
本例题参考:
最后希望能和大家一起交流进步,拿到心仪的 offer !!!