大家好,我是张桃狮。
升级到Excel 2021以后,我发现一个不太好复现的bug。
编辑表格的时候,偶尔会出现鼠标点选错位、乱跑、选错格的问题。
刚开始我没有在意,将表格关了重新打开,就恢复正常了。
可是后来我发现,这个bug隔三差五就会出现,让人很头疼。
之前我用Excel 2016和2019的时候,可从来没有遇到这个问题。
降级使用的话,我就用不了xlookup函数了,这是万万不能的。
我在网上搜索了一番。
发现网上的各种建议,什么关闭硬件加速、修改注册表、调整缩放比例、卸载插件,通通都不管用。
不过有一个帖子引起我的兴趣,来自吾愛破解论坛。
https://www.52pojie.cn/thread-2042442-1-1.html
excel鼠标点击单元格错行问题如何解决?大家好,excel出现这样的问题如何解决啊?已经重置excel,用安全模式启动过excel,关闭了硬件加速,重新缩放过,甚至删除过office的注册表,但是问题依旧。是从office2021版以后开始出现这样的问题的,office2019不存在这样的问题,但是我工作要用office的xlookup函数,老版本没有。
我看到下面有个最佳答案。
应该没法彻底解决 这个bug出现原因就是最左上角单元格显示不全,导致光标和鼠标产生错位。 有一个治标不治本的办法是点击当前屏幕左上角那个单元格,让它完整显示。要治本的话只能等微软程序员彻底解决这个bug;或者改用wps,wps也有xlookup。
我对这个帖子很感兴趣,不过可惜的是,当时我还没有遇到这个bug,只能将这个帖子收藏备用。
俗话说,有心栽花花不开,无心插柳柳成荫。
我一直想着bug复现后,测试帖子里的方法是否有效,结果好几天过去了,都没有遇到这个bug。
就在我快忘了这回事的时候,这个bug终于复现了。
我赶紧在左上方找了一个文本内容超长的单元格,选中后点击自动换行,这个bug神奇的消失了。
看来这个方法好使。
我将这个单元格的自动换行取消后,bug也没有再现。
估计点击自动换行能解决bug,是因为强制全表布局重算,临时对齐坐标。
可是为什么要求是左上角呢,我还没有想明白。
咱们闲话少说,继续力扣刷题。
力扣350. 两个数组的交集 II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小,哪种方法更优?
如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
我的思路
可以复用上一道题排序+双指针的代码,需要将去重部分代码去掉。
class Solution: def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]: nums1.sort() nums2.sort() length1, length2 = len(nums1), len(nums2) intersection = list() index1 = index2 = 0 while index1 < length1 and index2 < length2: num1 = nums1[index1] num2 = nums2[index2] if num1 == num2: intersection.append(num1) index1 += 1 index2 += 1 elif num1 < num2: index1 += 1 else: index2 += 1 return intersection
力扣提交通过,时间复杂度O(m log m + n log n),空间复杂度O(log m + log n)。
我想不出更好的方法了,看官方题解吧。
力扣官方题解
方法一:哈希表
class Solution: def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]: if len(nums1) > len(nums2): return self.intersect(nums2, nums1) m = collections.Counter() for num in nums1: m[num] += 1 intersection = list() for num in nums2: if (count := m.get(num, 0)) > 0: intersection.append(num) m[num] -= 1 if m[num] == 0: m.pop(num) return intersection
力扣提交通过,时间复杂度O(n + m),空间复杂度O(min (n,m))。
说实话这个代码我看不太懂,但是官方题解的思路我看懂了。
就是先把一个列表转字典,字典键是列表元素,字典值是列表元素重复次数。
然后循环另一个列表,如果列表元素在字典中存在,就将列表元素加入输入列表,并将列表元素重复次数-1。
我打算按照自己的理解写一版代码。
class Solution: def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]: nums1_dict=dict() intersect=list() for i in nums1: if i in nums1_dict: nums1_dict[i] += 1 else: nums1_dict[i] = 1 for i in nums2: if i in nums1_dict and nums1_dict[i] != 0: intersect.append(i) nums1_dict[i] -= 1 return intersect
力扣提交通过,时间复杂度O(n + m),空间复杂度O(n)。
不过我的代码没有添加判断两个列表大小的模块。
我打算先判断两个列表的长度,如果nums1>nums2,就交换两个列表的值。
为了最后再换回来,增加一个swaped变量开关辅助判断。
class Solution: def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]: swaped=False if len(nums1)>len(nums2): nums1,nums2=nums2,nums1 swaped=True nums1_dict=dict() intersect=list() for i in nums1: if i in nums1_dict: nums1_dict[i] += 1 else: nums1_dict[i] = 1 for i in nums2: if i in nums1_dict and nums1_dict[i] != 0: intersect.append(i) nums1_dict[i] -= 1 if swaped: nums1,nums2=nums2,nums1 return intersect
力扣提交通过,时间复杂度O(n + m),空间复杂度O(min (n,m))。
我终于写出了跟官方题解复杂度一样的代码,撒花!
官方题解中的递归比大小、Counter和海象运算符有点过于炫技了。
方法二:排序 + 双指针
class Solution: def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]: nums1.sort() nums2.sort() length1, length2 = len(nums1), len(nums2) intersection = list() index1 = index2 = 0 while index1 < length1 and index2 < length2: if nums1[index1] < nums2[index2]: index1 += 1 elif nums1[index1] > nums2[index2]: index2 += 1 else: intersection.append(nums1[index1]) index1 += 1 index2 += 1 return intersection
力扣提交通过,时间复杂度O(m log m + n log n),空间复杂度O(log m + log n)。
代码思路跟我的差不多,不赘述了。
我是个编程爱好者,小白级别的,如果你跟我一样希望通过力扣刷题,学习各种奇妙的算法,可以关注我,大家一起学习。