华为笔试(黑色星期五与编码问题)

第一道题是字符串编码问题,就是输入gbk格式的中文,和字母,截取一定的字符,但是不能把中文截成两半。

python默认的是UTF-8的格式,在UTF-8中中文和英文一样处理,都是一个字符的长度,

>>>s='中文1234编码5678'
>>>s[:1]
'中文
>>>s[2]
'1'
>>>s[6:8]

'编码'

解决方法:先用encode方法将字符串转换为bytes,encode的作用就是使我们看到的直观的字符转换成计算机内的字节形式,这里encode的参数encoding='gbk'表示编码为GBK方案,errors='ignore'表示忽略错误。GBK编码方案中每个中文字编码为2个字节,这样就可以与排版显示的宽度一致,截取指定位置字串后再使用decode方法解码为GBK格式。编码方案也可以使用其他如utf-8、unicode等,但这样每个中文字符编码长度有可能与排版显示长度不一样,在格式化输出时计算长度就有点复杂了:
>>> ss = s.encode(encoding='gbk',errors='ignore')
>>> print(ss)
b'\xd6\xd0\xce\xc41234\xb1\xe0\xc2\xeb5678'
>>> ss[:4].decode(encoding='gbk',errors='ignore')
'中文'
>>> ss[8:12].decode(encoding='gbk',errors='ignore')

'编码'


第二个是黑色星期五。

import sys 
b= input().split()
n=int(b[0])
w=int(b[1])
if(len(b)>2 or len(b)<2):
    print("-1")
    exit()
if(n<0 or n>400):
    print("-1")
    exit()
if(w<0 or w>6):
    print("-1")
    exit()



def get(y,m):  
    if(y%4==0 and y%100!=0):  
        i=1  
    elif(y%400==0):
        i=1
    else:  
        i=0  
    if(m==1 or m==3 or m==5 or m==7 or m==8 or m==10 or m==12):  
        return 31  
    elif m==2:  
        if(i==1):  
            return 29  
        else:  
            return 28  
    return 30  
# 输入n,限定范围.注意转化为int类型  

a= [0 for i in range(7)]  
week=6
for i in range(1900,1900+n):  
    for j in range(1,13):  
        a[week%7]+=1  
        week+=get(i,j)  
#print(str(a[6])+" "+str(a[0]))  
#for i in range(1,6):  
print(str(a[w]))  


核心思想就是先手动推断出第一个13号是周几,算出是周六,week=6。然后算出这个月是多少天,加上,然后对7取余。这个时候可以算出下个月13号是周几,直到给定的日期,输出周五的个数。

整体来说不难,但是我的通过率只有87%,不知道是那部分原因,是不是输入的时候没有判断是不是字符?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值