LeetCode(#4)寻找两个有序数组的中位数&小数点的保留&输出形式(python)

输出形式:

第一种:print(’:.2f’).format(…)

print('{0},{1}'.format('zhangk', 32))
 
print('{},{},{}'.format('zhangk','boy',32))
 
print('{name},{sex},{age}'.format(age=32,sex='male',name='zhangk'))
 
# 格式限定符
# 它有着丰富的的“格式限定符”(语法是{}中带:号),比如:
 
# 填充与对齐
# 填充常跟对齐一起使用
# ^、<、>分别是居中、左对齐、右对齐,后面带宽度
# :号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充
 
print('{:>8}'.format('zhang'))
print('{:0>8}'.format('zhang'))
print('{:a<8}'.format('zhang'))
print('{:p^10}'.format('zhang'))

#输出:
#   zhang
#000zhang
#zhangaaa
#ppzhangppp


# 精度与类型f
# 精度常跟类型f一起使用
print('{:.2f}'.format(31.31412))
 
# 其他类型
# 主要就是进制了,b、d、o、x分别是二进制、十进制、八进制、十六进制
print('{:b}'.format(15))
 
print('{:d}'.format(15))
 
print('{:o}'.format(15))
 
print('{:x}'.format(15))
 
# 用逗号还能用来做金额的千位分隔符
print('{:,}'.format(123456789))

第二种:
print(’%2f’%…)

%d就是普通的输出了

% 2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格。
% 02d,和% 2d差不多,只不过左边补0
%.2d 输出整形时最少输出2位,如不够前面以0占位。如输出2时变成02。200时只输出200;输出浮点型时(%.2f)小数点后强制2位输出

小数点的保留

a = 1
b = 3
print(a/b)
#方法一:
print(round(a/b,2))
#方法二:
print(format(float(a)/float(b),'.2f'))
#方法三:
print ('%.2f' %(a/b))

示例

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0
示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

方法一:暴力法,时间复杂度超过 O(log(m + n)),应该是
把两个列表合并为一个列表,去掉重复元素,用普通方法求中位数。

array1=list(int(x) for x in input().split())
array2=list(int(x) for x in input().split())

print(array1)
print(array2)
"""
list_new=[]
for i in range(len(array1)):
    list_new.append(array1[i])
for i in range(len(array2)):
    list_new.append(array2[i])
"""
list_new=array1+array2#直接相加即可
#list_new=list(set(list_new))#去掉重复元素,本题不用去掉
list_new.sort()
print(list_new)


def findmedium(list):
    if len(list)%2==1:
        value=list[len(list)//2]
    else:
        value=round((list[len(list)//2-1]+list[len(list)//2])/2,1)
    return value

print('{:.1f}'.format(findmedium(list_new)))

方法二:
看到log,想到的应是二分法,具体步骤可看解析

A=list(int(i) for i in input().split())
B=list(int(i) for i in input().split())

print(A)
print(B)

def median(A,B):
    m=len(A)
    n=len(B)

    if m>n:
        A,B,m,n=B,A,n,m
    #if n == 0:
     #   raise ValueError

    i_min,i_max=0,m
    half=(m+n+1)//2#错误点:python3中应该//
    while i_min<=i_max:#错误点:遗漏
        i = (i_min + i_max) // 2
        j = half - i
        if i > 0 and A[i - 1] > B[j]:#j<n
            i_max = i - 1
        elif i < m and B[j - 1] > A[i]:#j>0
            i_min = i + 1
        else:
            if i == 0:
                max_of_left = B[j - 1]
            elif j == 0:
                max_of_left = A[i - 1]
            else:
                max_of_left = max(A[i - 1], B[j - 1])

            if (m + n) % 2 == 1:#错误点:应该将奇数情况放到前面,否则out of range
                return max_of_left

            if i == m:
                min_of_right = B[j]
            elif j == n:
                min_of_right = A[i]
            else:
                min_of_right = min(A[i] , B[j])#错误点:语法错误

            return (max_of_left + min_of_right) / 2.0#注意点:2.0



print(median(A,B))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值