小白的秋招記錄——機試刷題(華爲2016研發工程師編程題)

 

1、刪數

有一個數組a[N]順序存放0~N-1,要求每隔兩個數刪掉一個數,到末尾時循環至開頭繼續進行,求最後一個被刪掉的數的原始下標位置。以8個數(N=7)爲例:{0,1,2,3,4,5,6,7},0->1->2(刪除)->3->4->5(刪除)->6->7->0(刪除),如此循環直到最後一個數被刪除。

輸入描述:

每組數據爲一行一個整數n(小於等於1000),爲數組成員數,如果大於1000,則對a[999]進行計算。

輸出描述:

一行輸出最後一個被刪掉的數的原始下標位置。

輸入例子:

  8

輸出例子:

  6 

思路一:

這是我比較直接的想法。定義一個長度爲n的列表,列表值爲0/1,表示元素是否被刪除。

考慮題目描述,每隔兩個數刪除一個數,即遍歷列表,每經過兩個未被刪除的數(值爲0),刪除第三個值爲0的數。定義兩個指針count_total和count_0輔助計算。count_total用來遍歷數組,count_0記錄值爲0,即未被刪除的數,第3*n個即爲結果。

代碼:

import sys

def last_delete_num(l,n):
    count_0 = 0
    count_total = 0
    while count_0 < 3*n:
        if l[count_total%n] == 0:
            count_0 += 1
            if count_0 % 3 == 0:
                l[count_total%n] = 1
        count_total += 1
    return count_total%n-1

while 1:
    line = sys.stdin.readline().strip()
    if not line:
        break
    n = min(int(line), 1000)
    l = [0] * n
    print last_delete_num(l,n)

 

思路二:

這是一個約瑟夫環問題,遞推公式爲:f[1] = 0 ,f[n] = (f[n - 1] + K) mod n,k = 3

原始:[0,1,2,3,4,5,6,7],刪除的第一個數,即f(n)一定是(k-1)%n

刪除第一個元素k-1後:[0,1,   ,3,4,5,6,7] -> [5,6,   ,0,1,2,3,4](令k=0, k+1=1...) -> [0,1,2,3,4,5,6](旋轉)

刪除第二個元素後:[0,1,   ,4,5,6,7] -> [4,5,   ,0,1,2,3] -> [0,1,2,3,4,5]

    在新的列表中,刪除的第二個數是 (k-1)%(n-1),(這裏的2是原列表中的5,只要找到2和5的關係就可以了)  

    新環f(n-1)是由舊環f(n)中的元素減k模n得到的  即f(n) = (f(n-1)+k)%n

依次類推:[0,1,2,3,4] .....[0,1]  ->  [0]

代碼:

import sys

def last_delete_num(n):
    ans = 0
    for i in range(2,n+1):
        ans = (ans+3) % i
    return ans

while 1:
    line = sys.stdin.readline().strip()
    if not line:
        break
    n = min(int(line), 1000)
    #l = [i for i in range(n)
    print last_delete_num(n)

 

2、字符集合

輸入一個字符串,求出該字符串包含的字符集合

輸入描述:

每組數據輸入一個字符串,字符串最大長度爲100,且只包含字母,不可能爲空串,區分大小寫。

輸出描述:

每組數據一行,按字符串原有的字符順序,輸出字符集合,即重複出現並靠後的字母不輸出。

輸入例子1:         abcqweracb

輸出例子1:         abcqwer

看起來有點簡單了,沒看懂這題要考什麼

import sys
while 1:
    s = sys.stdin.readline().strip()
    if s == '':
        break
    l = []
    for i in s:
        if i not in l:
            l.append(i)
    print ''.join(l)

 

3、數獨

數獨是一個我們都非常熟悉的經典遊戲,運用計算機我們可以很快地解開數獨難題,現在有一些簡單的數獨題目,請編寫一個程序求解。

輸入描述:

輸入9行,每行爲空格隔開的9個數字,爲0的地方就是需要填充的。

輸出描述:

輸出九行,每行九個空格隔開的數字,爲解出的答案。

 

# -*- coding:utf-8 -*-
import sys
def is_sudoku(ll, add_value, add_x, add_y):     #添加Sudoku(i,j)後,是否仍滿足數獨條件
    for i in range(9):
        if add_value == ll[add_x][i]:    #行
            return False
        if add_value == ll[i][add_y]:    #列
            return False
    for i in range(add_x/3*3,add_x/3*4):      #宮
        for j in range(add_y/3*3,add_y/3*4):
            if add_value == ll[i][j]:
                return False
    return True

def sudoku(ll, add_list):
    if len(add_list) == 0:  
        return True
    else:
        add_x, add_y = add_list[0][0], add_list[0][1]
        for i in range(1, 10):
            if is_sudoku(ll, i, add_x, add_y):
                ll[add_x][add_y] = i
                flag = sudoku(ll, add_list[1:])
                if flag:
                    return True
                ll[add_x][add_y] = 0
        return False

while (True):
    ll = []          #數獨
    add_list = []    #記錄需要填充的位置
    for i in range(9):
        l = map(int, raw_input().split())
        ll.append(l)
        for j in range(9):
            if ll[i][j] == 0:
                add_list.append([i,j])
    sudoku(ll,add_list)
    for l in ll:
        print ' '.join(map(str, l))

來源:牛客網

語言:python2.7

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章