数据结构的算法面试题一

1.给定一个数组arr,长度为N,arr可以从中间任何一个位置被切成左右两半,但是规定左右两部分必须有数字,那么在不同的切法下,都会有左部分和右部分最大值差值的绝对值,请返回所有的切法下,这个值最大是什么

其实大家第一个想法就是找到最大值最小值,这两个肯定是最大值。

切成的两个数组里面,这两个里面最大值肯定能在一个数组里面,那么另外一个肯定在另外一个数组么?这个数组里面的最大值都是一样的,都是最小值么?

这个肯定不是的,这样一刀切的时候并不能报告数据旁边的大小是什么。

如果int[] arr = {1, 4, 5, 7, 2, -3, 6, 3};或者int[] arr = {5, 2, 4, 7, 3, -3, 6, 1};

最小值在最左边或者在最右边的时候,我们拿到的可能就是我们最好的结果,但是现实情况中,并不一定会出现这种情况的。

大家可以使用数组,把我们的目标数组进行转化{1, 4, 5, 7, 2, -3, 6, 3}-》{1, 4, 5, 7, 7, 7, 7, 7},这样看我们是不是就可以看出来一些端倪了,当然这个是我们最理想的情况,那么我们换一个不是最理想的情况{3, 2, 4, 7, 1, -3, 5, 6}-》{3, 3, 4, 7, 7, 7, 7, 7},这样从一个或者第二个切的时候就是最大的了。

这种是我们从左表开始统计的,那么如果数组变成了{6, 8, 4, 7, 1, -3, 5, 2},转化完了是不是就是{6, 8, 8, 8, 8, 8, 8, 8},这个是不是我们想要的呢,一看其实就不是,这里我们转化的时候,如果是从右开始转化呢,就可以转化成{8, 8, 7, 7, 5, 5, 5, 2},这个是不是就是我们想要的了。

通过上面的两次转化,我们是不是需要判断一个问题,就是我们的数组里面是0上的数组大,还是N-1的位置数字大,剩下的就不用过说了,通过上面的转化就可以了。

当然这么转化,在数据结构里面其实是占用空间了,那么有没有不用占用空间的好办法呢?

直接找到0和N-1里面的最小值,这个值是一个数组,剩下的单独一个数组,这个办法是不是更好一些呢。

2. 给定一个数组arr,长度为N,数组分为两部分,使得其和相差最小

其实想写这个博客的原因就是因为这个面试题,我一个同事经常性的会给我发一些大场面是给我,正好上次我看到了这个题(某次的美团二面面试题),当时我第一眼并没有什么好的办法,但是这个题一直存在我们的脑袋里面,想着要不要把这个分享给大家。

这个看起来是不是和上面的那个题差不多,但是解题的思路,并不是跟上面的一样。

如果大家遇到的是那种算到最后,两边的数组都是一样的值,其实就好一些。比如{1,2,3,4,10},这样的数据就比较好了一面是{1,2,3,4},领外一面是{10},这样两边是不是就是一样的了,两边和都是10,相差是0,肯定是满足我们的。但是这种肯定是不一定存在的,所以我们在解题的时候不能用这种数据来做的。

其实这个题,大家要是理解面试官要的东西,大家在解题的时候就好解多了,大家想一下相差最少,是不是就相当于距离整体数组和除以2的值也是最小的呢?顺着这个思路,剩下的其实就好说了,大家可以直接排序,然后一个一个去叠加,还可以不用排期,直接叠加去比较。

3.给定一个数组arr,长度为N,如果某个数的出现次数 > N/2,就管这个数叫超级水王数,返回arr中的超级水王数,如果没有超级水王数,返回-1

这个水王数的问题,看着也是有些相似的,就放到这里了。

最简单粗暴的办法就是直接遍历,算出来对应的数组里面最多的数是多少,是不是超过一半就可以了。

但是这个肯定不是面试官想要的,这个时候我们就需要想想怎么才能得到这个数据呢?

首先先明确一点,这里出现的次数是必须大于N/2的,等于都不行的,所以这里肯定是有一半的数字都是一个。

那么我们是不是可以使用删除的策略,每次删除两个不一样的数据,直到我们不能再删除的时候就是水王数了。

看起来是不是很简单,但是还是存在问题的,如果数组是{1,2,3,4,5},这个时候删除两组数组后是不是还留下来一个,那么留下来的这个也不是水王数。大家是不是在想,是不是可以在删除之前判断是否有水王数,当然可以,但是你都判断完了,还删除做什么呢?

这里可以定义两个值,一个是目标值,一个是目标值的血量,分为几种情况,

如果目标值没有值,或者目标值与当前值一样,那么就把当前值给目标值,血量+1

如果目标值与当前值不一样,血量-1

如果血量是0的时候,那么目标值也就没有值了

这样直接算到最后的时候剩下在目标值里面的,是不是就是我们的水王数了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为您介绍一些常见的数据结构算法面试题。以下是一些常见的数据结构算法面试题及其解答: 1. 请解释什么是数组数组是一种线性数据结构,它由相同类型的元素组成,并按照一定的顺序存储在连续的内存空间中。数组可以通过索引来访问和修改其中的元素。 2. 请解释什么是链表? 链表是一种线性数据结构,它由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表的优点是插入和删除操作的时间复杂度为O(1),但访问元素的时间复杂度为O(n)。 3. 请解释什么是栈和队列? 栈和队列都是常见的数据结构。 - 栈是一种后进先出(LIFO)的数据结构,只允许在栈顶进行插入和删除操作。 - 队列是一种先进先出(FIFO)的数据结构,允许在队尾进行插入操作,在队头进行删除操作。 4. 请解释什么是二叉树? 二叉树是一种特殊的树结构,每个节点最多有两个子节点。二叉树可以分为二叉搜索树、平衡二叉树、完二叉树等不同类型。 5. 请解释什么是排序算法? 排序算法是将一组数据按照一定的顺序进行排列的算法。常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等。 6. 请解释什么是动态规划? 动态规划是一种解决多阶段决策问题的优化方法。它通过将问题分解为多个子问题,并保存子问题的解,避免重复计算,从而提高算法的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值