CSDN 周赛37期题解

CSDN 周赛37期题解

  • 1、题目名称:幼稚班作业
  • 2、题目名称:异或和
  • 3、题目名称:大整数替换数位
  • 4、题目名称:莫名其妙的键盘
  • 卡个bug
  • 小结

1、题目名称:幼稚班作业

幼稚园终于又有新的作业了。 老师安排同学用发给同学的4根木棒拼接成一个三角形。 当然按照正常的逻辑,如果不能拼
接成三角形。 必然要折断某个木棍来拼接三角形。 可是懒惰的小艺当然不会费力了! 如果拼接不成三角形,小艺就会把
它拼接成类似边长 1 1 2的伪三角形(两边之和等于第3边)。 如果伪三角形都拼接不成那就不交作业!

这个题目其实还是有点误导性的,老顾第一次碰到这个题目,是在 csdn 每日一练中碰到的,当时就算的蒙蒙的,最后是看了别人的题解才明白是啥逻辑。

四个木棒,任意三根能组成三角形就算ok,不需要两个最短的当做一根来处理这样的方式,于是解答就很简单了

class Solution:
	def __init__(self) -> None:
		pass
	def solution(self, arr):
		arr.sort()
		if arr[0] + arr[1] > arr[2] or arr[1] + arr[2] > arr[3]:
			return 1
		elif arr[0] + arr[1] == arr[2] or arr[1] + arr[2] == arr[3]:
			return 0
		else:
			return -1
if __name__ == "__main__":
	arr = [int(item) for item in input().strip().split()]
	sol = Solution()
	result = sol.solution(arr)
	print(result)

2、题目名称:异或和

小张找到了一个整数 N,他想问问你从 1 到 N 的所有不同整数的异或和是多少, 请你回答他的问题。
此题由CSDN用户a23333a提供。

额。。。。这个题是来送分的,从1一直异或和到N即可,异或运算符是 ^,知道运算符就很简单了。

class Solution:
	def __init__(self) -> None:
		pass
	def solution(self, N):
		result = 0
		for i in range(1,N + 1):
			result ^= i
		return result
if __name__ == "__main__":
	N = int(input().strip())
	sol = Solution()
	result = sol.solution(N)
	print(result)

3、题目名称:大整数替换数位

以字符串的形式给你一个长度为 M 的整数 N,请你计算出对这个数进行一次操作后模 9 的值为 1 的所有可能的不同操作
方式。
在一次操作中, 我们可以选择 N 的一个数位 N[i],并把它替换成另一个不同的 0 到 9 范围之内的数 B,当且仅当它们选
择的 i 或 B 不同时两种操作方式不同。
此题由CSDN用户a23333a提供

我恨这个叫 a23333a 的家伙,这个题目猛一接触我就犯懵了,这是啥?替换操作还能有多个结果?岁数大了,脑子就没那么灵光了,于是就拿起纸和笔一通乱画,总算明白题主的意思了。比如 10 余1,那么就可以把0换成9,或者91余1,可以把9换成0这样子,并且本身余1的也算。那么计算逻辑也就出来了,根据当前数字得到的余,来计算每个位上的数字有几种替换可能就好。其实做到最后老顾有点晕菜了,具体怎么算的也不确定了,可以看到老顾提交的代码中,余1的情况重复了,在for循环中,余1余0的部分都是无效代码。

另外,就是这个题目输入的内容是什么鬼?M居然是个1元素数组?你长度放数组里做毛线?还有就是N,居然是个大整数?bug区都有小伙伴提意见了啊亲。白瞎了我还专门写了两行代码想转下类型呢。如果是字符串,在没有python这么强大的整型支持的时候,计算一个数取9的余数,可以把各位的数字相加得到的和继续相加,直到变成1位数,就可以了,因为9的倍数有个很特别的点,就是所有位数的和相加就是9的倍数。

class Solution:
	def __init__(self) -> None:
		pass
	def solution(self, M, N):
		n = N
		N = str(N)
		mod = n % 9
		ans = 0
		if mod == 1:
			return (N.count('0') + N.count('9')) * 2
		for i in range(M[0]):
			if mod == 1:
				if N[i] in '09':
					ans += 1
				elif mod == 0:
					ans += 1
			else:
				if int(N[i]) == mod - 1:
					ans += 2
				else:
					ans += 1
		result = ans
		return result
if __name__ == "__main__":
	M = [int(item) for item in input().strip().split()]
	N = int(input().strip())
	sol = Solution()
	result = sol.solution(M, N)
	print(result)

4、题目名称:莫名其妙的键盘

有一个神奇的键盘,你可以用它输入a到z的字符,然而每当你输入一个元音字母(a,e,i,o,u其中之一)的时候,已输入的字
符串会发生一次反转! 比方说,当前输入了tw,此时再输入一个o,此时屏幕上的字符串two会反转成owt。 现给出一个
字符串,若用该键盘输入,有多少种方法可以得到?

这个题貌似也在哪里见过,但老顾自己没去做过这个题目,印象中应该是在谁家的题解里瞄过一眼。具体逻辑也记不清了。还是靠着纸上比划出来的。

具体就是在只有1个元音字母前,所有的可能都被锁死了,只需要计算最后只剩1个元音字母时的字符串长度即可(在这个元音字母翻转时)

在这一题,老顾浪费了很长时间,主要是 str=str[1:][::-1] 这里,当时忘记写成 -1,写成1了,最后怎么计算得到的结果都不对。。。郁闷了

class Solution:
	def __init__(self) -> None:
		pass
	def solution(self, str):
		s = str
		result = 0
		while len(str) > 0 and str[0] in 'aeiou':
			str = str[1:][::-1] # 这里翻转字符串应该填写 -1,老顾写成1,浪费了大把时间
			if len(str) == 0:
				result += 1
				break
			result = 0
			while len(str) > 0 and str[0] not in 'aeiou':
				result += 1
				str = str[1:]
				if len(str) == 0:
					result += 1
		return result
if __name__ == "__main__":
	str = input().strip()
	sol = Solution()
	result = sol.solution(str)
	print(result)

卡个bug

在考试期间,他会检测是否有跳出页面,是否有粘贴代码,这算是正常的,但是,我没跳出页面,自己复制自己的代码,一粘贴(Ctrl+V)就算一次粘贴,鼠标右键粘贴没试过,估计也会记录。但是,有另外一种情况,当程序抛出异常后,选择抛出异常的文本,拖动到代码里,这个不算粘贴?

小结

这次的题目不难,脑子灵活点的小朋友提交的都很快,耐心点的小伙伴们也能拿到很好的成绩

这次看了下得分榜,真不知道那些得分连25分都没有的小伙伴们进来是干什么的?凑数的?时间不值钱吗?

本来以为这次因为耽误的时间较多,提交后都50多分钟了,还以为会落榜,结果这次参加考试的大佬好像也不多,除了常见的两位大佬@CodeRecycle,@请叫我问哥,其他都不太常见,居然让老顾又摸到了前十的尾巴。

CSDN 周赛37期题解_第1张图片
参加了这么多场,才有3次进入前十,落伍了啊,老顾。不要甘于凑数,奋力向前。

你可能感兴趣的:(python,算法,算法,csdn周赛,37期题解)