HackerRank-Medium笔记(二) Second 5 Problems


*Forming a Magic Square(规制魔方)

Problem Link

Problem Description

魔方矩阵的行列之和均为15,且元素从[1,9]各出现一次
设计算矩阵行列之和,得出两个代表行列和的数组 ,并结合元素排序得到的数组进行判断

查询其他解答发现使用的是枚举出所有的 3 阶魔方解集,依次遍历求得代价,感觉不太巧妙

Function Description

Complete the formingMagicSquare function in the editor below. It should return an integer that represents the minimal total cost of converting the input square to a magic square.
formingMagicSquare has the following parameter(s):

  • s: a array of integers
Solution
def formingMagicSquare(s):
    row = []
    for line in s:
        row.append(sum(line))
    column = s[0]
    for i in range(1, len(s)):
        for j in range(len(s)):
            column[j] = column[j] + s[i][j]

The Time in Words(时间文字)

Problem Link

Problem Description

有些过于简单的题目,不知道为什么分类到Medium

Function Description

Complete the timeInWords function in the editor below. It should return a time string as described.
timeInWords has the following parameter(s):

  • h: an integer representing hour of the day
  • m: an integer representing minutes after the hour
Solution
def timeInWords(h, m):
    _known = {
    0:'zero',
    1:'one',
    2: 'two',
    3: 'three',
    4: 'four',
    5: 'five',
    6: 'six',
    7: 'seven',
    8: 'eight',
    9: 'nine',
    10: 'ten',
    11: 'eleven',
    12: 'twelve',
    13: 'thirteen',
    14: 'fourteen',
    15: 'quarter',
    16: 'sixteen',
    17: 'seventeen',
    18: 'eighteen',
    19: 'nineteen',
    20: 'twenty',
    21: 'twenty one',
    22: 'twenty two',
    23: 'twenty three',
    24: 'twenty four',
    25: 'twenty five',
    26: 'twenty six',
    27: 'twenty seven',
    28: 'twenty eight',
    29: 'twenty nine',
    30: 'half'}
    
    if 0<=m<=30:
        mKey = _known.get(m)
        hKey = _known.get(h)
        if m == 1:
            return mKey + " minute" + " past " + hKey
        if m == 15 or m == 30:
            return mKey + " past " + hKey
        elif m == 0:
            return hKey+" o' clock"
        else :
            return mKey + " minutes" + " past " + hKey
    elif m>30:
        mKey = _known.get(60-m)
        hKey = _known.get(h+1)
        if m == 45:
            return mKey + " to " + hKey
        else :
            return mKey + " minutes" + " to " + hKey

3D Surface Area(三维表面积)

Problem Link

Problem Description

求体位为单位1组成的三维积木的表面积,分别求六个面的面积(各个方向行列的高低差)然后汇总

Solution
def surfaceArea(A):
    r = len(A)
    c = len(A[0])
    # 上下表面积
    surface = 2*r*c
    for line in A:
        surface-=line.count(0)
    # 前后左右面积
    up = sum(A[0])
    down = sum(A[-1])
    left=right=0
    for i in range(r):
        left += A[i][0]
        right += A[i][-1]
    for i in range(r-1):
        for j in range(c):
            if A[i][j]<A[i+1][j]:
                up+=A[i+1][j]-A[i][j]
            elif A[i][j]>A[i+1][j]:
                down+=A[i][j]-A[i+1][j]
    for i in range(r):
        for j in range(c-1):
            if A[i][j]<A[i][j+1]:
                left+=A[i][j+1]-A[i][j]
            elif A[i][j]>A[i][j+1]:
                right+=A[i][j]-A[i][j+1]

    s = surface + up + down + left + right
    return s

*Queen's Attack II(皇后攻势II)

Problem Link

Problem Description

求皇后的进攻区域面积,可以先确定无障碍情况下的攻击区域,然后加上障碍将区域刷新

*仍然有10个cases无法通过,暂不清楚原因

Solution
def queensAttack(n, k, r_q, c_q, obstacles):
    # 将皇后的位置改为0-base
    r_q -= 1
    c_q -= 1
    # 初始化棋盘矩阵
    matrix =[]
    for i in range(n):
        line = []
        for j in range(n):
            line.append(0)
        matrix.append(line)
    # 先确定无障碍的攻击区域
    for i in range(n):
        for j in range(n):
            if i==r_q or j==c_q or abs(r_q-i) == abs(c_q-j):
                matrix[i][j] = 1
    # 修改攻击区域
    for item in obstacles:
        x = item[0]-1
        y = item[1]-1
        if x == r_q:
            if y<c_q:
                for i in range(y):
                    matrix[x][i]=0
            else:
                for i in range(y):
                    matrix[x][n-i]=0
        elif y == c_q:
            if x<r_q:
                for i in range(x):
                    matrix[i][y]=0
            else:
                for i in range(x):
                    matrix[n-i][y]=0
        elif abs(r_q-x) == abs(c_q-y):
            pass

    matrix[r_q][c_q] = 0
    # 统计攻击区域面积
    count = 0
    for line in matrix:
        count += sum(line)
    return count

后发现这样做冗余操作太多,需要额外在内存中建立Matrix,不如省略棋盘建模

New Solution
def queensAttack(n, k, r_q, c_q, obstacles):
    # 统计无障碍攻击区域面积
    count = 2*(n-1)
    count += n - abs(r_q-c_q)-1
    count += n - abs(r_q+c_q-n-1)-1
    # 修改攻击区域
    for item in obstacles:
        x = item[0]
        y = item[1]
        if x == r_q:
            if y<c_q:
                count -= y
            else:
                count -= n-y
        elif y == c_q:
            if x<r_q:
                count -= x
            else:
                count -= n-x

        if abs(r_q-x) == abs(c_q-y):
            if x<r_q:
                if y<c_q:
                    count -= min(x,y)
                else:
                    count -= min(x,n-y)
            else:
                if y<c_q:
                    count -= min(n-x,y)
                else:
                    count -= min(n-x,n-y)  
    return count

*Non-Divisible Subset(不可除子集)

Problem Link

Problem Description

如果满足A%K+B%K=K,则A+B之和可以被K整除

8/17 test cases failed,基本上是"Your code did not execute within the time limits",算法有待优化

Solution
def nonDivisibleSubset(k, s):
    # Write your code here
    mod = []
    for i in s:
        mod.append(i%k)
    mod.sort()

    # if mod[0]==0:
    #     for i in range(len(mod[0])):
    #         if mod[i]==0:
    #             mod.remove(0)
    #     mod.append(0)
    #     mod.sort()

    pairs = []
    count = len(mod)
    for num in mod:
        dist = k - num
        if mod.count(dist)!=0 and pairs.count([min(num,dist), max(num,dist)])==0:
            pairs.append([min(num,dist), max(num,dist)])
            if mod.count(num)<mod.count(dist):
                count -= mod.count(num)
            else:
                count -= mod.count(dist)

    return count

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容