記錄一道阿里內推筆試題 站在原點能看幾個其他的點

2021-08-17 16:12:21 字數 1504 閱讀 6025

師姐內推實習,可惜沒有好好準備,半小時都沒有完成這道題目,實在有愧.事後諸葛亮,現記錄一下題目和求解思路,由於沒有case,所以不知對錯,歡迎指正.

題目大約如下:所有的同學都站在座標系上的整數點,由原點看每個點,有的點被視線擋住了,求(長度為n時)原點能看到多少點,如下圖所示:比如n = 1時 輸出3; n=2時 輸出5; n=3時 輸出9; n = 4時,輸出13?我應該沒有算錯吧.

看到這道題,我首先想到的就是遞迴,f(2) = f(1)+ g(2)... f(n) = f(n-1) + g(n), g(n)是關於最外圍能看到點的函式.

所有問題在於求g(n)這個函式.最外圍能看到幾個點呢?首先最外圍總共有2*n + 1個點(筆試寫成2*n -1了,沒注意0也是點), 減去看不到的點就是能看到的點,看不到的點的數應該是n的約數, 那麼問題變成求n的約數個數了了. 筆試時想到這個,可惜函式出錯了,case還是沒過.此時g(n) = 2*n + 1 - ( 2 * n(約數個數) -1)

下面記錄一下python(研究生期間一直都是用的python,原諒我python是我最熟的,後面有機會會更新一下c++的**)的演算法,由於沒有case給我驗證,我也不知道有沒有出錯的地方,所以解題思路和**僅供參考,歡迎指正.

"""

created on sun mar 25 15:15:50 2018

@author: hjxu

"""import numpy as np

def countdivisors(num): #計算有多少個約數,這應該是計算約數時間複雜度最低的吧

cnt = 0

sqrt = int(num ** 0.5)

for x in range(1, sqrt + 1):

if num % x == 0:

cnt += 1

return cnt * 2 - (sqrt ** 2 == num)

def count_num(n):

if n == 1:

return 3

else:

result = np.zeros((n + 1))# 建立乙個n+1的陣列,用來存放數字

result[1] = 3 # 從1開始,便於理解

for i in range (2,n+1): #迴圈遞迴

result[i] = result[i-1] + 2 * i + 1 - ( 2 * countdivisors(i ) -1)

return int(result[n])

n = input('')

if (isinstance(n,int) and n > 0):           

print count_num(n)

else:

print 'error! place enter integer greater than 0'

阿里演算法內推筆試題

include include include include include include include include define pi 3.1415926 define num 10000 using namespace std 請完成下面這個函式,實現題目要求的功能 當然,你也可以不按...

一道阿里巴巴筆試題

今天看了阿里的一道筆試題 如下函式,在32bit 系統foo 2 31 3 的值是 int foo int x a 0 b 1 c 2 d 4 也沒想那麼多,覺得需要借助計算機程式設計才能得到答案!事實上呢,看看下面的程式和結果,你就明白了!cpp view plain copy include i...

阿里巴巴一道筆試題

其實這是谷歌的一道面試題 給定能隨機生成整數1到5的函式,寫出能隨機生成整數1到7的函式 慚愧,阿里的筆試題做錯了,說實話,以前沒見過,見過了就把搞懂 阿里題目 給定rand 7 表示能生成1 7的隨機數,使用四則運算和迴圈等控制語句,可以輸出的有 rand 3 b.rand 21 c.rand 2...