CSDN编程竞赛第七期python题解

 给大家带来第七期的python解析,有问题欢迎交流

1、题目名称:奇偶排序
给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。

 遍历就行

class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, n, arr):
        result = None
        # TODO: 请在此编写代码
        n1=[]
        n2=[]
        for i in arr:
            if i%2==0:
                n2.append(str(i))
            else:
                n1.append(str(i))
        result=n1+n2
        return result
if __name__ == "__main__":
    n = int(input().strip())
    arr = [int(item) for item in input().strip().split()]
    s = Solution()
    result = s.solution(n, arr)
    print(" ".join(result))

 

2、题目名称:小艺照镜子
已知字符串str。 输出字符串str中最长回文串的长度。

 遍历时从中间向两边看是否是回文的,记得回文串有奇数偶数两种情况


class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, s):
        result = None

        len_s=len(s)
        ans=1
        for i in range(len_s):
            tmp=1
            side=1
            while i-side>=0 and i+side<=len_s-1:
                if s[i+side]==s[i-side]:
                    tmp+=2
                    side += 1
                else:
                    break
            ans=max(ans,tmp)
        for i in range(len_s-1):
            tmp=2
            side=1
            if s[i]==s[i+1]:
                while i - side >= 0 and i+1+side<=len_s-1:
                    if s[i + 1 + side] == s[i - side]:
                        tmp += 2
                        side += 1
                    else:
                        break
            ans = max(ans, tmp)



        result=ans
        return result

if __name__ == "__main__":
    s = input().strip()
    s1 = Solution()
    result = s1.solution(s)
    print(result)

 

 3、题目名称:交换后的or 给定两组长度为n的二进制串,请问有多少种方法在第一个串中交换两个不同位置上的数字,使得这两个二进制串“或”的 结果发生改变?

两组二进制数位有4种情况:01,00,11,10.统计四种情况数量,有n00*(n10+n11)+n01*n10情况会改变结果
class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, n, str1, str2):
        result = None
        # TODO: 请在此编写代码
        n00=0
        n01=0
        n10=0
        n11=0
        for i in range(n):
            if str1[i]=='0':
                if str2[i]=='0':
                    n00+=1
                else:
                    n01+=1
            else:
                if str2[i]=='0':
                    n10+=1
                else:
                    n11+=1
        result=n00*(n10+n11)+n01*n10
        return result

if __name__ == "__main__":
    n = int(input().strip())
    str1 = input().strip()
    str2 = input().strip()
    s = Solution()
    result = s.solution(n, str1, str2)
    print(result)

 

4、题目名称:去除整数 已知存在集合A包含n个整数,从1到n。 存在m个整数a[1..m]。 在集合A中去除这m个整数的的倍数。 输出集合中包含 的元素的个数。

将需要去除的数在自己到n的范围中全部的倍数加到列表中,删除列表中重复的数,即得到需要去除的数的集合
class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, n, m, arr):
        result = None
        # TODO: 请在此编写代码
        list=[]
        ans_all=0
        for i in arr:
            for j in range(1,(n//i)+1):
                list.append(i*j)
        list=set(list)
        result=n-len(list)
        return result
if __name__ == "__main__":
    arr_temp = [int(item) for item in input().strip().split()]
    n = int(arr_temp[0])
    m = int(arr_temp[1])
    arr = [int(item) for item in input().strip().split()]
    s = Solution()
    result = s.solution(n, m, arr)
    print(result)

 

你可能感兴趣的:(python,算法)