---
# System prepended metadata

title: Online Assesement 2021-07-04
tags: [assesement, leetcode]

---

# Online Assesement 2021-07-04 
###### tags: `leetcode` `assesement`

* 兩題題目，一個小時，兩題 easy，都有 follow up
 
## :memo: 第一題

![](https://i.imgur.com/d5dKLsQ.png)
![](https://i.imgur.com/wZ2vySc.png)

## :memo: 題意
* :medal: 題目很簡單，就是問你他給你的數，可不可為 2＾x 次方。



## :memo: My solution
* :medal: **思考一**: 就一直 /2 然後用 %2 判斷是不是有餘數不等於零的情況。

## :memo: Code
```python=
class Solution(object):
    def isPowerOfTwo(self, n):
        if n == 0:
            return False
        while n % 2 == 0:
            n /= 2
        return n == 1
```

## :memo: BigO
* 時間複雜度: O(log n)。
* 空間複雜度: O(1)

## :memo: My solution2
* :medal: **思考一**: 如果是2^n 次方，那這個數的 binary 一定是 100000.....，所以還可以這樣寫。

```python=
class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        if n <= 0: return False
        
        binn = bin(n)
        for i in range(2,len(binn)):
            if i == 2 and binn[i] != '1':
                return False
            elif i != 2 and binn[i] != '0':
                return False
        
        return True
```


## :memo: follow up solution
* :medal: **思考一**: 如果是 2^n 次方，舉例來說 8 代表是從 '111' => '1000'，因此 n & (n-1) 如果等於 0 的話，一定是 2^n 次方，這個一定要記在腦海裡要向反射動作一樣，做過蠻多應用這觀念的題目了，但我常常還是想不到。

```python=
class Solution(object):
    def isPowerOfTwo(self, n):
        if n == 0:
            return False
        return n & (n - 1) == 0
```
## :memo: BigO
* 時間複雜度: O(1)。
* 空間複雜度: O(1)

## :memo: 第二題

![](https://i.imgur.com/IMo5E9l.png)



## :memo: 題意
* :medal: 給你一個 numslist，然後這個 list 如果有 n 長度，那裡面應該要有 1~n 的數字，如果沒有這些數字的話請 return。


## :memo: My solution
* :medal: **思考一**: 使用 hash table 將應該要有的數字放到這個 hash table，然後forloop numslist，如果有在 hash table 裡的則 remove 裡面的的數字，最後return hash table，這邊我用 set 來做 hash table。


## :memo: Code

```python=
class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        

        dset = set([n for n in range(1, len(nums)+1)])

        
        for i in nums:
            if i in dset:
                dset.remove(i)
                
                
        return list(dset)
```

## :memo: BigO
* 時間複雜度: O(len(nums))
* 空間複雜度: O(len(nums))


## :memo: leetcode follow up solution
* :medal: **限制**: 如果不能額外空間且時間複雜度為 n 要怎麼實作？

```python=
class Solution(object):
    def findDisappearedNumbers(self, nums):

        for i in range(len(nums)):
   
            new_index = abs(nums[i]) - 1

            if nums[new_index] > 0:
                nums[new_index] *= -1

        result = []    

        for i in range(1, len(nums) + 1):
            if nums[i - 1] > 0:
                result.append(i)
                
        return result      
```

## :memo: BigO
* 時間複雜度: O(len(nums))。
* 空間複雜度: O(1)




## :memo: 真正操作的時間
* 總共 15 分鐘。

![](https://i.imgur.com/Wjjpnkj.png)
