面试代码题

日萌社

 

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


面试题

面试代码题


给定两个数组表示的整数, 返回最接近第二个整数, 并且大于第二个整数的值。

# coding=utf-8
import numpy as np

def getclosenumber(x, y):
    sorted_x = sorted(x)
    length = len(x)
    result = []
    used = [False] * length
    for i in range(length):
        j = 0
        while j < length and (used[j] or sorted_x[j] < y[i]):
            j += 1

        used[j] = True
        result.append(sorted_x[j])

        if j == length:
            break

        if sorted_x[j] > y[i]:
            for k in range(length):
                if not used[k]:
                    result.append(sorted_x[k])
            break

    return result
    
def main():
    x = [4, 6, 2, 0, 3, 5]
    y = [5, 3, 2, 4, 1, 0]
    res = getclosenumber(x, y)
    print("res=%s" % res)


if __name__ == '__main__':
    main()

在一维数组中,找出一个点,使得其所有左边的数字均小于等于它,所有右边的数字都大于等于它。返回这个点所在的下标,要求你的算法时间复杂度为O(n)

def get_point_number(a):
	length = len(a)
	result = []
	flag = [0] * length
	first_max = a[0]
	for i in range(0, length):
		if a[i] >= first_max:
			first_max = a[i]
				flag[i] = 1
	second_min = a[-1]
	for i in range(length - 1, -1, -1):
		if a[i] <= second_min:
			second_min = a[i]
			if flag[i] == 1:
				result.append(i)
	return result

def main():
	a = [1, 0, 1, 0, 1, 2, 3]
	res = get_point_number(a)
	print(res)
if __name__ == '__main__':
	main()

蛙跳,给出一维非负元素的数组,每个元素代表该元素位置能够跳的最远距离。假设初始位置在第一个元素,请根据输入数组判断是否能跳到数组的末尾。

def frog_jump(a):
    i = 0
    length = len(a)
    current_max = 0
    while i < length - 1:
        if a[i] == 0 and current_max < i + 1:
            return False
        if a[i] + i > current_max and a[i] > 0:
            current_max = a[i] + i
            if current_max >= length - 1:
                return True
        i += 1

    return False


def main():
    a = [2, 1, 3, 1, 1]
    b = [3, 2, 1, 0, 1]
    res = frog_jump(b)
    print(res)
    res = frog_jump(a)
    print(res)


if __name__ == '__main__':
    main()

神经网络的训练中如何判断过拟合?如果防止过拟合, 都有哪些办法?请详细说明

训练集上的指标在提升, 同时验证集上的指标在下降是过拟合最直观的表现。使用Relu, dropout, batchnormalization, 降低网络参数量, 层数, 复杂度等等都可以。

给定一个整形数组, 找出最大下标距离 j - i , 当且仅当 A[i] < A[j] 和 i < j

算法思路: 记录从数组第⼀个元素开始的下降序列descent_seq, 然后使⽤指针从尾部开始逆向扫
描, 求出满⾜要求的下标的最⼤距离。
反证法: 假设存在最⼤下标距离的两个下标i和j, 满⾜i<j, A[i]<A[j], 并且A[i]不在
descent_seq中。
 如果上述假设情况发⽣, 那么我们⼀定还能找到⼀个k, 满⾜k<i, A[k]<A[i], 那么此
时最⼤下标距离应该是j-k, ⽽不是j-i, ⽭盾! 因此假设不成⽴!
 得出结论: 满⾜要求的A[i]⼀定在descent_seq中, 也就是⼀定在从数组第⼀个元素开
始的下降序列中。
# coding=utf-8

def maxDistance(array):
    descent_array = []
    max_number = array[0]
    for i in range(len(array)):
        if i == 0:
            descent_array.append('O')
        else:
            if array[i] < max_number:
                descent_array.append('O')
                max_number = array[i]
            else:
                descent_array.append('X')

    print(descent_array)

    i = j = len(descent_array) - 1
    max_distance = 0
    max_i = -1
    max_j = -1
    while i >= 0:
        if descent_array[i] == 'X':
            i -= 1
            continue

        while array[j] <= array[i] and i < j:
            j -= 1

        if i < j and j - i > max_distance:
            max_distance = j - i
            max_i = i
            max_j = j

        i -= 1

    return max_distance, max_i, max_j


def main():
    array = [5, 3, 4, 0 ,1, 4, 1]
    dis, a, b = maxDistance(array)
    print("dis=%d, start=%d, end=%d" % (dis, a, b))


if __name__ == '__main__':
    main()

给定一个一维数组,里面只有一个数字出现了一次,其他数字都出现了2次,请将这个唯一出现了一次的数字找出来。

采用将整个数组元素依次执行异或操作,最终的结果值C就是那个唯一出现了一次的数字。

相比于RNN处理序列数据, 我们可以用CNN处理同样的文本吗?如何实施? 有哪些需要特殊处理的地方?请尽可能详细的给出说明或图示

- - 关于采用CNN来处理文本, 需要考虑的是卷积核的大小设置, 只能设为[conv_length, sequence_length], 第一个维度为卷积尺寸, 可以是2, 3, 4这样的值, 但是第二个维度必须和数字化张量的第二个维度匹配, 即等于sequence_length。其他的处理步骤和RNN基本一致。

给定一个只含数字的字符串,返回所有合法的IP地址。

# coding=utf-8
import numpy as np

def get_all_ip(s, start, part, ip, result):
    length_s = len(s)
    if length_s - start > (4 - part) * 3:
        return

    if length_s - start < (4 - part):
        return

    if start == length_s and part == 4:
        result.append(ip[:-1])
        return

    num = 0
    max_i = np.minimum(start+3, length_s)
    for i in range(start, max_i):
        num = num * 10 + int(s[i])
        if num < 256:
            ip += s[i]
            get_all_ip(s, i+1, part+1, ip+'.', result)
        if num == 0:
            break


def get_ip(s):
    result = []
    ip = ''
    get_all_ip(s, 0, 0, ip, result)
    return result


def main():
    s = '10112'
    res = get_ip(s)
    for i in res:
        print(i)


if __name__ == '__main__':
    main()

之前基础上实现股票买卖2.0,给定一个数组,第i个元素代表第i天的股价。假设最多允许进行2次买卖,求可能的最大利润是多少? ​​​​​​​

# coding=utf-8
import numpy as np

def get_max_profit(price):
    length = len(price)
    current_profit = [0] * length
    future_profit = [0] * length
    low = price[0]
    for i in range(1, length):
        low = np.minimum(low, price[i])
        current_profit[i] = np.maximum(current_profit[i - 1], price[i] - low)

    high = price[length - 1]
    for i in range(length - 2, -1, -1):
        high = np.maximum(high, price[i])
        future_profit[i] = np.maximum(future_profit[i + 1], high - price[i])

    max_profit = 0
    for i in range(0, length):
        max_profit = np.maximum(max_profit, current_profit[i] + future_profit[i])

    return max_profit
    
def main():
    price = [68, 72, 59, 73, 66, 63, 59, 72, 65, 70, 64, 75, 71, 70, 67, 70, 72, 66, 63, 59, 68, 73, 74]
    result = get_max_profit(price)
    print(result)


if __name__ == '__main__':
    main()

在之前基础上实现蛙跳2.0,给出一维非负元素的数组,每个元素代表该元素位置能够跳的最远距离。假设初始位置在第一个元素,并假设输入数组能满足到达数组末尾,求最少的跳数是多少?

def frog_jump(a):
    result = 0
    last = current = 0
    length = len(a)
    for i in range(length):
        if i > last:
            last = current
            result += 1
        current = max(current, i + a[i])
    
    return result


def main():
    a = [2, 1, 3, 1, 1]
    res = frog_jump(a)
    print(res)

if __name__ == '__main__':
    main()

输入一个递增有序数组的一个旋转,输出旋转数组的最小值

def get_min_value(a):
    left = 0
    right = len(a) - 1
    min_value = a[left]
    while left < right:
        mid = int(left + (right - left) / 2)
        min_value = min(a[left], min_value)
        if (a[mid] == a[left]) and (a[mid] == a[right]):
            left += 1
        elif a[mid] >= a[left]:
            left = mid + 1
            min_value = min(a[left], min_value)
        else:
            min_value = min(a[mid], min_value)
            right = mid - 1

    return min_value


def main():
    a = [3, 4, 5, 6, 1, 2]
    res = get_min_value(a)
    print('res=%d' % res)


if __name__ == '__main__':
    main()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

あずにゃん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值