20230411 暑期实习算法笔试

异或归零

对于二进制字符串s,异或上若干个长度相等起所有连续的二进制串(000111,1100,010,10等),使得所有位都为0,最少要进行多少次异或运算?
示例

  1. 00011101 输出 2
  2. 0 输出 0

分析:其实相当于数有几个连通块

def fun(n,s): #n 字符串s的长度    s 二进制字符串
    cnt=0
    if s[0]=='1':cnt+=1
    for i in range(1,n):
        if s[i]=='1' and s[i-1]=='0':
            cnt+=1
    return cnt

fun(8,'00011101') #结果 2
字符串的修改

对于字符串’111222333’进行多少次修改,可以保证相邻字符不相等。

def fun(s):
	arr=list(s)
	cnt=0
	for i in range(1,len(s)):
		if arr[i]==arr[i-1]:
			arr[i]='+'
			cnt+=1
	return cnt
乘二除二

题目:给定一个大小为n的数组,选择k个元素,使得每个元素分别进行一次如下操作:

  1. 该元素乘以2
  2. 该元素除以2,向下取整
    经过k次操作之后,该数组的极差最小。
    示例:
    输入:
    3 2 #代表有3个数 选取2个数进行操作
    2 1 5
    输出:
    0 #1*2 且 5//2,使得这个数组=[2,2,2]
    不会
import heapq

n, k = map(int, input().split())
nums = list(map(int, input().split()))

nums.sort()
queueMin = []
queueMid = []
queueMax = []
minMin, midMin, maxMin = float('inf'), float('inf'), float('inf')

for i in range(k):
    minMin = min(minMin, 2 * nums[i])
    heapq.heappush(queueMin, -2 * nums[i])

for i in range(k, n):
    midMin = min(midMin, nums[i])
    heapq.heappush(queueMid, -nums[i])
字母拆分

一个字母==两个字母顺序表中前一个字母,即b=aa,c=bb。
问输入k,打印出最短的可以拆分出k个a的字符串。

def fun(k):
    i=0
    ans=[]
    while k:
        if k%2==1:ans.append(chr(ord('a')+i))
        i+=1
        k=k//2
    return ''.join(ans)
fun(5)

结果:
‘ac’

对树进行操作

N个结点的树,根节点编号为1.
最开始,树上所有结点都为1。
操作:选择一个子树,让子树的所有结点的值+1.
问:需要多少次操作才可以让每个结点的值等于其编号。

好串

对于一个字符串,当只有一个字符串的出现次数为奇数,其他字符出现次数为偶数。
输出一个字符所拥有子序列中是好串的个数,并且对1e9+7进行取模操作。

最长路径

输入:
n #表示树的结点个数
[1,2,3,4,5,3]. #n-1个整数,第i个整数pi表示结点i+1与pi之间有连接。
3 7 #表示有一条路经过3和7这条边
输出:
4 ,经过这条边的简单路径中,最长的那条。

分析:
计算分别以这两个端点能去达的最远距离。

G={
    
    } #生成字典地图
nums=[1,2,3,4,5,3]
for i in range(len(nums)):
    G[i+2]=[nums[i]] if not G.get(i+2) else G[i+2].append(nums[i])
    if G.get(nums[i])==None:
        G[nums[i]]=[i+2]
    else:
        G[nums[i]].append(i+2)

res=0
dist={
    
    i:0 for i in G.keys()}
def dfs(s,t):
    global res
    res=max(res,dist[s])
    for node in G[s]:
        if node==t:
            continue
        dist[node]=dist[s]+1
        dfs(node,s)
dfs(3,7) #查看细节
print(G)
print(res)
print(dist)
dfs(3,7)+1+dfs(7,3) #计算结果

猜你喜欢

转载自blog.csdn.net/F13122298/article/details/130073650