Resetting the repo, preserving old data

This commit is contained in:
pro100ton 2024-12-27 10:07:15 +03:00
parent 6e36b869c2
commit 8ada2330d5
63 changed files with 3 additions and 6333 deletions

1
archive/27.12.2024 Submodule

@ -0,0 +1 @@
Subproject commit 6e36b869c21a448c0fcdcfe7e154c8e6ea336756

2
archive/README.md Normal file
View file

@ -0,0 +1,2 @@
# Archive
Made for resetting repository and move all previously solved tasks here.

View file

@ -1,51 +0,0 @@
// Binary Search in C
#include <stdio.h>
int binarySearch(int array[], int x, int low, int high)
/**
* Binary search implementation.
* int array[] - sorted array of INT to search for
* x - INT value for searching
* low - initial search starting index
* high - initial last array index
*/
{
// Repeat until the pointers low and high meet each other
while (low <= high)
{
// Calculating mid position of an array
int mid = low + (high - low) / 2;
// If value of center object == value to search for
if (array[mid] == x)
// Return it
return mid;
// If mid value is less than value to search for
if (array[mid] < x)
// Move low border to the right
low = mid + 1;
// If mid value is greater than value to search for
else
// Move high border to mid-1 position
high = mid - 1;
}
// If no value found - return -1
return -1;
}
int main(void)
{
int array[] = {3, 4, 5, 6, 7, 8, 9};
int n = sizeof(array) / sizeof(array[0]);
int x = 8;
int result = binarySearch(array, x, 0, n - 1);
if (result == -1)
printf("Not found");
else
printf("Element is found at index %d", result);
return 0;
}

View file

@ -1,33 +0,0 @@
// Binary Search in C
#include <stdio.h>
int binarySearch(int array[], int x, int low, int high) {
if (high >= low) {
int mid = low + (high - low) / 2;
// If found at mid, then return it
if (array[mid] == x)
return mid;
// Search the left half
if (array[mid] > x)
return binarySearch(array, x, low, mid - 1);
// Search the right half
return binarySearch(array, x, mid + 1, high);
}
return -1;
}
int main(void) {
int array[] = {3, 4, 5, 6, 7, 8, 9};
int n = sizeof(array) / sizeof(array[0]);
int x = 4;
int result = binarySearch(array, x, 0, n - 1);
if (result == -1)
printf("Not found");
else
printf("Element is found at index %d", result);
}

View file

@ -1,31 +0,0 @@
# Binary Search in python
def binarySearch(array, x, low, high):
# Repeat until the pointers low and high meet each other
while low <= high:
mid = low + (high - low)//2
if array[mid] == x:
return mid
elif array[mid] < x:
low = mid + 1
else:
high = mid - 1
return -1
array = [3, 4, 5, 6, 7, 8, 9]
x = 4
result = binarySearch(array, x, 0, len(array)-1)
if result != -1:
print("Element is present at index " + str(result))
else:
print("Not found")

View file

@ -1,34 +0,0 @@
# Binary Search in python
def binarySearch(array, x, low, high):
if high >= low:
mid = low + (high - low)//2
# If found at mid, then return it
if array[mid] == x:
return mid
# Search the left half
elif array[mid] > x:
return binarySearch(array, x, low, mid-1)
# Search the right half
else:
return binarySearch(array, x, mid + 1, high)
else:
return -1
array = [3, 4, 5, 6, 7, 8, 9]
x = 4
result = binarySearch(array, x, 0, len(array)-1)
if result != -1:
print("Element is present at index " + str(result))
else:
print("Not found")

View file

@ -1,55 +0,0 @@
from typing import List, Optional
# Task 4.1: Write a code with recursion for calculating summ of all array entries
def calculate_recursion_summ(array_of_ints: List[int]) -> int:
if len(array_of_ints) == 0:
return 0
return array_of_ints[0] + calculate_recursion_summ(array_of_ints[1:])
print(calculate_recursion_summ([5, 5, 5, 5, 5]))
# Task 4.2: Write a code with recursion for calculating the amount of elements in List
def calculate_list_length(array_of_ints: List[int]) -> int:
if len(array_of_ints) == 1:
return 1
return 1 + calculate_list_length(array_of_ints[1:])
print(calculate_list_length([1, 2, 3, 4, 5, 6, 7, 8]))
# Task 4.3: Write a code to find a highest list value with recursion
def find_highest_value_in_lits(array_of_ints: List[int]) -> int:
if len(array_of_ints) == 1:
return array_of_ints[0]
elif len(array_of_ints) == 2:
return (
array_of_ints[0]
if array_of_ints[0] > array_of_ints[1]
else array_of_ints[1]
)
else:
sub_max = find_highest_value_in_lits(array_of_ints[1:])
return array_of_ints[0] if array_of_ints[0] > sub_max else sub_max
print(find_highest_value_in_lits([1, 2, 3, 4, 5, 4, 3, 2, 1, 1231]))
# Task 4.4: Make binary search using recursion
def binary_search(array_of_ints: List[int], target_value: int) -> Optional[int]:
array_len = len(array_of_ints)
if array_len == 1:
return array_of_ints[0] if array_of_ints[0] == target_value else None
max_left = array_of_ints[array_len // 2]
return (
binary_search(array_of_ints[: array_len // 2], target_value)
if target_value < max_left
else binary_search(array_of_ints[array_len // 2:], target_value)
)
print(binary_search([1, 2, 3, 4, 5], 4))

View file

@ -1,50 +0,0 @@
from collections import deque
# Dummy function to check that person is selling mangos
def person_is_seller(name: str) -> bool:
# If last person letter is "m" than he is mango seller
return name[-1] == "m"
# Implementation of BFS of example graph
def bfs():
# Modeling graph using hash map
graph = {}
graph["me"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["tom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["tom"] = []
graph["jonny"] = []
# Creating queue for checking
search_queue = deque()
# Declaring searched persons list for avoiding infinite loop situation
searched = []
# Adding first people to queue, starting from me
search_queue += graph["me"]
# Start searching
while search_queue:
# Getting first person from queue
person = search_queue.popleft()
# Checking that person is already searched
if person not in searched:
if person_is_seller(person):
print("{name} is a mago seller!".format(name=person))
return
else:
# Adding new neighbours to queue
search_queue += graph[person]
# Add current searched person to searched list
searched.append(person)
print("No mango sellers in your friends list :(")
return False
bfs()

View file

@ -1,11 +0,0 @@
```mermaid
flowchart TB
A(me) --> B(alice)
A --> C(bob)
A --> D(claire)
B --> P(peggy)
C --> P
C --> AN(anuj)
D --> T(tom)
D --> J(jonny)
```

View file

@ -1,130 +0,0 @@
# First - initializing the graph
graph = {}
# Put first element in graph
graph["start"] = {}
graph["start"]["a"] = 6
graph["start"]["b"] = 2
# Put A element in graph
graph["a"] = {}
graph["a"]["fin"] = 1
# Put B element in graph
graph["b"] = {}
graph["b"]["fin"] = 5
graph["b"]["a"] = 3
# Put last element in graph
graph["fin"] = {}
# Now we need to declare "costs" hash table
# Costs table shows how much time needed to reach to this node from the starting node
# Settings up infinity value
infinity = float("inf")
# initializing "costs" hash-table
costs = {}
costs["a"] = 6
costs["b"] = 2
costs["fin"] = infinity
# We also needed "parents" hash-table
parents = {}
parents["a"] = "start"
parents["b"] = "start"
parents["fin"] = None
# ------- Notebook graph example -------
graph_notebook = {}
graph_notebook["a"] = {}
graph_notebook["a"]["b"] = 1
graph_notebook["a"]["d"] = 10
graph_notebook["b"] = {}
graph_notebook["b"]["c"] = 2
graph_notebook["c"] = {}
graph_notebook["c"]["d"] = 3
graph_notebook["c"]["e"] = 15
graph_notebook["d"] = {}
graph_notebook["d"]["e"] = 1
graph_notebook["e"] = {}
costs_notebook = {}
costs_notebook["b"] = 1
costs_notebook["d"] = 10
costs_notebook["c"] = infinity
costs_notebook["e"] = infinity
# We also needed "parents" hash-table
parents_notebook = {}
parents_notebook["b"] = "a"
parents_notebook["d"] = "a"
parents_notebook["c"] = None
parents_notebook["e"] = None
def dijkstra_algo(graph, costs, parents):
# We need to store processed nodes list
processed = []
# First we need to define function for finding the lowest cost node to process it
def find_lowest_cost_node(costs):
lowest_cost = float("inf")
lowest_cost_node = None
for node in costs:
cost = costs[node]
if cost < lowest_cost and node not in processed:
lowest_cost = cost
lowest_cost_node = node
return lowest_cost_node
# And now we initiate the algorithm
node = find_lowest_cost_node(costs)
step = 1
while node is not None:
print(f"Step {step}")
print(f"Current data:\nParents: {parents}\nCosts: {costs}\n\n")
print(f"current lowest node: {node}. Start to inspect it")
cost = costs[node]
neighbors = graph[node]
print(f"Cost of node {node} = {cost}")
print(f"Neighbors of node {node} = {neighbors}")
for n in neighbors.keys():
print(f" Processing neighbor {n}")
new_cost = cost + neighbors[n]
print(f" New calculated cost for neighbor {n} = {new_cost}")
if costs[n] > new_cost:
print(
f" New calculated cost {new_cost} is lower than old node cost {costs[n]} so we replace it with new value and new parent {node}"
)
costs[n] = new_cost
parents[n] = node
print(
f" New costs table:\n {costs}\n New parents table:\n {parents}"
)
else:
print(
f" New calculated cost {new_cost} is greater than old node cost {costs[n]} so we do not touching costs and parents table"
)
print(f" Costs table:\n {costs}\n Parents table:\n {parents}")
print(
f"Work with node {node} is finished, so we marking it with processed label"
)
processed.append(node)
node = find_lowest_cost_node(costs)
step += 1
print("--------------------")
print(processed)
print(parents)
print(costs)
dijkstra_algo(graph_notebook, costs_notebook, parents_notebook)

View file

@ -1,11 +0,0 @@
```mermaid
flowchart LR
B(book) -- 5 -->REC(record)
B -- 0 --> P(poster)
P -- 35 --> D(drums)
REC -- 20 --> D
REC -- 15 --> BG(bas guitar)
P -- 30 -->BG
BG -- 20 --> PIA(piano)
D -- 10 --> PIA
```

View file

@ -1,8 +0,0 @@
```mermaid
flowchart LR
ST(Start) -- 6 --> A
ST -- 2 --> B
A -- 1 --> F(Finish)
B -- 5 --> F
B -- 3 --> A
```

View file

@ -1,36 +0,0 @@
from collections import deque
graph = {}
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["thom"] = []
graph["jonny"] = []
def person_is_seller(name):
return name[-1] == "z"
def search(name):
search_queue = deque()
search_queue += graph[name]
print(search_queue)
searched = []
while search_queue:
person = search_queue.popleft()
if person not in searched:
if person_is_seller(person):
print(person + " is a mango seller!")
return True
else:
search_queue += graph[person]
searched.append(person)
print(searched)
return False
search("you")

View file

@ -1,42 +0,0 @@
# Штаты, которые необходимо покрыть
states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])
# Станции, на которых вещают имеющиеся радиостанции
stations = {}
stations["kone"] = set(["id", "nv", "ut"])
stations["ktwo"] = set(["wa", "id", "mt"])
stations["kthree"] = set(["or", "nv", "ca"])
stations["kfour"] = set(["nv", "ut"])
stations["kfive"] = set(["ca", "az"])
# Набор радиостанций, покрывающий все необходимые штаты
final_stations = set()
while states_needed:
best_station = None
# Штаты, обслуживаемые этой станцией, которые еще не входят в текущее покрытие
states_covered = set()
# Перебор всех радиостанций и поиск наилучшей из них
for station, states_for_station in stations.items():
# Пересечение множеств необходимых к покрытию станций с станциями для
# итерируемой радиостанции
covered = states_needed & states_for_station
# Если длина множества пересечения больше длины покрытия лучшей текущей станции
# Иными словами в пересечение входит больше покрываемых штатов, чем для текущей
# лучшей станции
if len(covered) > len(states_covered):
# Назначаем эту станцию лучшей
best_station = station
# Переопределяем штаты, покрываемые лучшей на данный момент станцией
states_covered = covered
# После прохождения цикла лучшая станция добавляется в список станций для покрытия
final_stations.add(best_station)
# Необходимо вычесть из нужных для покрытия станций те, которые входят в найденную
# станцию
states_needed -= states_covered
print(final_stations)

View file

@ -1,26 +0,0 @@
from typing import List
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
if numRows == 1:
return [[1]]
if numRows == 2:
return [[1],[1,1]]
result = [[1], [1,1]]
for i in range(3, numRows+1):
tmp = [0] * i
tmp[0] = 1
tmp[len(tmp)-1] = 1
for j in range(1, len(tmp)-1):
prev = result[i-2]
tmp[j] = prev[j-1] + prev[j]
result.append(tmp)
return result
print(Solution().generate(numRows=5))
print("-"*60)
print(Solution().generate(numRows=1))
print("-"*60)
print(Solution().generate(numRows=10))
print("-"*60)

View file

@ -1,13 +0,0 @@
from typing import List
class Solution:
def maxProfit(self, prices: List[int]) -> int:
min_price = prices[0]
max_profit = 0
for price in prices[1:]:
max_profit = max(max_profit, price - min_price)
min_price = min(min_price, price)
return max_profit

View file

@ -1,13 +0,0 @@
# Самостоятельно не решил
from typing import List
class Solution:
def maxProfit(self, prices: List[int]) -> int:
return prices[1:]
sl1 = Solution()
print(sl1.maxProfit(prices=[7, 1, 5, 3, 6, 4]))
print(sl1.maxProfit(prices=[7, 6, 4, 3, 1]))
print(sl1.maxProfit(prices=[2, 1, 2, 1, 0, 1, 2]))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

View file

@ -1,20 +0,0 @@
from typing import List
class Solution:
def majorityElement(self, nums: List[int]) -> int:
majority_limit = len(nums) / 2
count_store = {}
for elem in nums:
try:
count_store[elem] += 1
except KeyError:
count_store[elem] = 1
if count_store[elem] > majority_limit:
return elem
sl1 = Solution()
sl2 = Solution()
print(sl1.majorityElement(nums=[3, 2, 3]))
print(sl1.majorityElement(nums=[2, 2, 1, 1, 1, 2, 2]))

View file

@ -1,20 +0,0 @@
from typing import List
class Solution:
def majorityElement(self, nums: List[int]) -> int:
majority_limit = len(nums) / 2
count_store = {}
for elem in nums:
if elem not in count_store.keys():
count_store[elem] = 1
else:
count_store[elem] += 1
if count_store[elem] > majority_limit:
return elem
sl1 = Solution()
sl2 = Solution()
print(sl1.majorityElement(nums=[3, 2, 3]))
print(sl1.majorityElement(nums=[2, 2, 1, 1, 1, 2, 2]))

View file

@ -1,19 +0,0 @@
from typing import List
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
while k > 0:
elem = nums.pop()
nums.insert(0, elem)
k -= 1
return nums
sl1 = Solution()
sl2 = Solution()
print(sl1.rotate(nums=[1, 2, 3, 4, 5, 6, 7], k=3))
print(sl1.rotate(nums=[-1, -100, 3, 99], k=2))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

View file

@ -1,11 +0,0 @@
from typing import List
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
index = 0
for i in range(len(nums)):
if nums[i] != val:
nums[index] = nums[i]
index += 1
return index

View file

@ -1,18 +0,0 @@
from typing import List
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
counter = 0
nums_iterator_index = len(nums) - 1
while nums_iterator_index >= 0:
if nums[nums_iterator_index] == val:
del nums[nums_iterator_index]
else:
counter += 1
nums_iterator_index -= 1
return counter
print(Solution().removeElement(nums=[3, 2, 2, 3], val=3))
print(Solution().removeElement(nums=[0, 1, 2, 2, 3, 0, 4, 2], val=2))

View file

@ -1 +0,0 @@
[link](https://leetcode.com/problems/remove-element/description/?envType=study-plan-v2&envId=top-interview-150)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

View file

@ -1,36 +0,0 @@
from typing import List
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
j = 1
for i in range(1, len(nums)):
if nums[i] != nums[i - 1]:
nums[j] = nums[i]
j += 1
print(nums)
return j
print(Solution().removeDuplicates(nums=[1, 1, 2]))
print()
print(Solution().removeDuplicates(nums=[0, 0, 1, 1, 1, 2, 2, 3, 3, 4]))
"""
The code starts iterating from i = 1 because we need to compare each element with its
previous element to check for duplicates.
The main logic is inside the for loop:
1. If the current element nums[i] is not equal to the previous element nums[i - 1],
it means we have encountered a new unique element.
2. In that case, we update nums[j] with the value of the unique element at nums[i],
and then increment j by 1 to mark the next position for a new unique element.
3. By doing this, we effectively overwrite any duplicates in the array and only keep
the unique elements.
Once the loop finishes, the value of j represents the length of the resulting array
with duplicates removed.
Finally, we return j as the desired result.
"""

View file

@ -1,21 +0,0 @@
from typing import List
class Solution:
def removeDublicates(self, nums: List[int]) -> int:
counter = 1
nums_unique_index = 0
delete_candidates = []
for i in range(1, len(nums)):
if nums[i] == nums[nums_unique_index]:
delete_candidates.append(i)
else:
nums_unique_index = i
counter += 1
for index in sorted(delete_candidates, reverse=True):
del nums[index]
return counter
print(Solution().removeDublicates(nums=[1, 1, 2]))
print(Solution().removeDublicates(nums=[0, 0, 1, 1, 1, 2, 2, 3, 3, 4]))

View file

@ -1 +0,0 @@
[link](https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/?envType=study-plan-v2&envId=top-interview-150)

View file

@ -1,13 +0,0 @@
from typing import List
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
if not nums:
return 0
for i, num in enumerate(nums):
if num >= target:
return i
return len(nums)

View file

@ -1,33 +0,0 @@
from typing import List
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
if len(nums) == 1:
return 1 if target > nums[0] else 0
max = len(nums) - 1
i = 0
while i < max:
if nums[i] == target:
return i
if target > nums[i]:
i += 1
if target < nums[i]:
return i
return i + 1 if target != nums[i] else i
sl1 = Solution()
print(sl1.searchInsert([1, 3, 5, 6], target=5))
print("---")
print(sl1.searchInsert([1, 3, 5, 6], target=2))
print("---")
print(sl1.searchInsert([1, 3, 5, 6], target=7))
print("---")
print(sl1.searchInsert([1, 3], target=1))
print("---")
print(sl1.searchInsert([1, 3], target=3))
print("---")
print(sl1.searchInsert([1], target=0))
print("---")
print(sl1.searchInsert([1], target=1))

View file

@ -1,41 +0,0 @@
from typing import List
class Solution:
def binary_search(self, array, x, low, high):
if high >= low:
mid = low + (high - low) // 2
if array[mid] == x:
return mid, None, None
elif array[mid] > x:
return self.binary_search(array, x, low, mid - 1)
else:
return self.binary_search(array, x, mid + 1, high)
else:
return None, high, low
def searchInsert(self, nums: List[int], target: int) -> int:
if len(nums) == 1:
return 1 if target > nums[0] else 0
bingo, high, low = self.binary_search(nums, target, 0, len(nums) - 1)
print(f"b: {bingo}")
print(f"h: {high}")
print(f"l: {low}")
if bingo or bingo == 0:
return bingo
else:
return low
sl1 = Solution()
print(sl1.searchInsert([1, 3, 5, 6], target=5))
print("---")
print(sl1.searchInsert([1, 3, 5, 6], target=2))
print("---")
print(sl1.searchInsert([1, 3, 5, 6], target=7))
print("---")
print(sl1.searchInsert([1, 3], target=1))
print("---")
print(sl1.searchInsert([1], target=0))
print("---")
print(sl1.searchInsert([1], target=1))

View file

@ -1,24 +0,0 @@
"""
1)It initializes an empty list called "res", which will be used to store all the valid elements in the board.
2)It loops through each cell in the board using two nested "for" loops.
For each cell, it retrieves the value of the element in that cell and stores it in a variable called "element".
3)If the element is not a dot ('.'), which means it's a valid number, the method adds three tuples to the "res" list:
The first tuple contains the row index (i) and the element itself.
The second tuple contains the element itself and the column index (j).
The third tuple contains the floor division of the row index by 3 (i // 3), the floor division of the column index by 3 (j // 3), and the element itself. This tuple represents the 3x3 sub-grid that the current cell belongs to.
4)After processing all the cells, the method checks if the length of "res" is equal to the length of the set of "res".
"""
class Solution(object):
def isValidSudoku(self, board):
res = []
for i in range(9):
for j in range(9):
element = board[i][j]
if element != ".":
res += [(i, element), (element, j), (i // 3, j // 3, element)]
return len(res) == len(set(res))

View file

@ -1,92 +0,0 @@
from typing import List
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
size = 9
cols = {
0: [],
1: [],
2: [],
3: [],
4: [],
5: [],
6: [],
7: [],
8: [],
}
rows = {
0: [],
1: [],
2: [],
3: [],
4: [],
5: [],
6: [],
7: [],
8: [],
}
mini_squares = {
"00": [],
"01": [],
"02": [],
"10": [],
"11": [],
"12": [],
"20": [],
"21": [],
"22": [],
}
for j in range(0, size):
mini_second_index = j // 3
for i in range(0, size):
mini_first_index = i // 3
mini_square_index = f"{mini_first_index}{mini_second_index}"
value = board[i][j]
if value != ".":
if (
value in cols[j]
or value in rows[i]
or value in mini_squares[mini_square_index]
):
return False
else:
cols[j].append(value)
rows[i].append(value)
mini_squares[mini_square_index].append(value)
return True
sl1 = Solution()
print(
sl1.isValidSudoku(
board=[
["5", "3", ".", ".", "7", ".", ".", ".", "."],
["6", ".", ".", "1", "9", "5", ".", ".", "."],
[".", "9", "8", ".", ".", ".", ".", "6", "."],
["8", ".", ".", ".", "6", ".", ".", ".", "3"],
["4", ".", ".", "8", ".", "3", ".", ".", "1"],
["7", ".", ".", ".", "2", ".", ".", ".", "6"],
[".", "6", ".", ".", ".", ".", "2", "8", "."],
[".", ".", ".", "4", "1", "9", ".", ".", "5"],
[".", ".", ".", ".", "8", ".", ".", "7", "9"],
]
)
)
print("-" * 60)
print(
sl1.isValidSudoku(
board=[
["8", "3", ".", ".", "7", ".", ".", ".", "."],
["6", ".", ".", "1", "9", "5", ".", ".", "."],
[".", "9", "8", ".", ".", ".", ".", "6", "."],
["8", ".", ".", ".", "6", ".", ".", ".", "3"],
["4", ".", ".", "8", ".", "3", ".", ".", "1"],
["7", ".", ".", ".", "2", ".", ".", ".", "6"],
[".", "6", ".", ".", ".", ".", "2", "8", "."],
[".", ".", ".", "4", "1", "9", ".", ".", "5"],
[".", ".", ".", ".", "8", ".", ".", "7", "9"],
]
)
)
print("-" * 60)

View file

@ -1,29 +0,0 @@
"""Explanation
Imagine you have a car, and you have some distance to travel (the length of the array).
This car has some amount of gasoline, and as long as it has gasoline, it can keep
traveling on this road (the array). Every time we move up one element in the array,
we subtract one unit of gasoline. However, every time we find an amount of gasoline
that is greater than our current amount, we "gas up" our car by replacing our current
amount of gasoline with this new amount.
We keep repeating this process until we either run out of gasoline (and return false),
or we reach the end with just enough gasoline (or more to spare), in which case we
return true.
Note: We can let our gas tank get to zero as long as we are able to gas up at that
immediate location (element in the array) that our car is currently at.
"""
from typing import List
class Solution:
def canJump(self, nums: List[int]) -> bool:
gas = 0
for n in nums:
if gas < 0:
return False
elif n > gas:
gas = n
gas -= 1
return True

View file

@ -1,32 +0,0 @@
# Не решил ...
from typing import List
class Solution:
def canJump(self, nums: List[int]) -> bool:
def calculate_jump_for_elem(elem, elem_index):
if elem == len(nums):
return True
for jump_distance in range(elem, -1, -1):
if (elem_index + jump_distance) == len(nums) - 1:
return True
if jump_distance == 0:
continue
jump_index = elem_index + jump_distance
if jump_index > len(nums) - 1:
continue
next_elem = nums[jump_index]
return calculate_jump_for_elem(next_elem, jump_index)
res = calculate_jump_for_elem(nums[0], 0)
return res if res else False
sl1 = Solution()
print(sl1.canJump(nums=[2, 3, 1, 1, 4]))
print(sl1.canJump(nums=[3, 2, 1, 0, 4]))
print(sl1.canJump(nums=[1]))
print(sl1.canJump(nums=[1, 2, 3]))
print(sl1.canJump(nums=[2, 5, 0, 0]))

View file

@ -1,31 +0,0 @@
from typing import List
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
for i in range(len(digits) - 1, -1, -1):
if digits[i] == 9:
digits[i] = 0
else:
digits[i] = digits[i] + 1
return digits
return [1] + digits
sl1 = Solution()
print(sl1.plusOne([1, 3, 5, 6]))
print("---")
print(sl1.plusOne([1, 2, 3]))
print("---")
print(sl1.plusOne([4, 3, 2, 1]))
print("---")
print(sl1.plusOne([9, 9, 9]))
print("---")
print(sl1.plusOne([0]))
print("---")
print(sl1.plusOne([9]))
print("---")
print(sl1.plusOne([1, 9, 9, 9, 9]))
print("---")
print(sl1.plusOne([9, 8, 9]))

View file

@ -1,44 +0,0 @@
from typing import List
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
j = len(digits) - 1
if j == 0:
if digits[0] + 1 < 10:
digits[0] = digits[0] + 1
return digits
else:
digits[0] = 1
digits.append(0)
return digits
digits[j] = digits[j] + 1
while j >= 1:
if digits[j] < 10:
return digits
if digits[j] == 10:
digits[j] = 0
digits[j - 1] = digits[j - 1] + 1
j -= 1
if digits[0] == 10:
digits[0] = 1
digits.append(0)
return digits
sl1 = Solution()
print(sl1.plusOne([1, 3, 5, 6]))
print("---")
print(sl1.plusOne([1, 2, 3]))
print("---")
print(sl1.plusOne([4, 3, 2, 1]))
print("---")
print(sl1.plusOne([9, 9, 9]))
print("---")
print(sl1.plusOne([0]))
print("---")
print(sl1.plusOne([9]))
print("---")
print(sl1.plusOne([1, 9, 9, 9, 9]))
print("---")
print(sl1.plusOne([9, 8, 9]))

View file

@ -1,15 +0,0 @@
from typing import List
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
j = 1
for i in range(1, len(nums)):
if j == 1 or nums[i] != nums[j - 2]:
nums[j] = nums[i]
j += 1
return j
print(Solution().removeDuplicates(nums=[1, 1, 1, 2, 2, 3]))
print(Solution().removeDuplicates(nums=[0, 0, 1, 1, 1, 1, 2, 3, 3]))

View file

@ -1,18 +0,0 @@
from typing import List
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
# print(nums)
# j = 1
# for i in range(1, len(nums)):
# if nums[i] != nums[i - 1]:
# nums[j] = nums[i]
# j += 1
# print(nums)
# return j
# Не решил:(
print(Solution().removeDuplicates(nums=[1, 1, 1, 2, 2, 3]))
print(Solution().removeDuplicates(nums=[0, 0, 1, 1, 1, 1, 2, 3, 3]))

View file

@ -1,18 +0,0 @@
class Solution:
def isPalindrome(self, x: int) -> bool:
res = [xx for xx in str(x)]
if len(res) == 1:
return True
i, j = 0, len(res) - 1
while i < j/2:
if res[i] != len(res) / 2:
return False
i += 1
j -= 1
return True
print(Solution().isPalindrome(x=121))
print(Solution().isPalindrome(x=-121))
print(Solution().isPalindrome(x=10))
print(Solution().isPalindrome(x=0))
print(Solution().isPalindrome(x=1000030001))

File diff suppressed because it is too large Load diff

View file

View file

@ -1,28 +0,0 @@
from typing import List
class Solution:
def hasDuplicate(self, nums: List[int]) -> bool:
if len(nums) == 0:
return False
res = dict()
for entry in nums:
is_dublicate = res.get(entry)
if is_dublicate:
return True
res[entry] = True
return False
input_1 = [1, 2, 3, 3]
input_2 = [1, 2, 3, 4]
input_3 = []
input_4 = [0]
input_5 = [1, 2, 2, 2, 2, 3, 1, 1]
sol = Solution()
print(sol.hasDuplicate(input_1))
print(sol.hasDuplicate(input_2))
print(sol.hasDuplicate(input_3))
print(sol.hasDuplicate(input_4))
print(sol.hasDuplicate(input_5))

View file

@ -1,39 +0,0 @@
from collections import defaultdict
from typing import Dict, List
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
if len(strs) <= 1:
return [strs]
result: List[List[str]] = []
char_counter: Dict[str, Dict[str, int]] = dict()
for word in strs:
sorted_word: str = "".join(sorted(word))
# Get by sorted_word key
sorted_entry = char_counter.get(sorted_word)
if sorted_entry:
char_counter[sorted_word].append(word)
else:
char_counter[sorted_word] = [word]
for value in char_counter.values():
result.append(value)
return result
class NeetcodeSolution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
ans = defaultdict(list)
for s in strs:
count = [0] * 26
for c in s:
count[ord(c) - ord("a")] += 1
ans[tuple(count)].append(s)
return ans.values()
s = Solution()
strs = ["act", "pots", "tops", "cat", "stodsafjoooop", "hat"]
print(s.groupAnagrams(strs))

View file

@ -1,41 +0,0 @@
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
s_chars = dict()
t_chars = dict()
for s_char in s:
new_char_check = s_chars.get(s_char)
if not new_char_check:
s_chars[s_char] = 1
else:
s_chars[s_char] += 1
for t_char in t:
new_char_check = t_chars.get(t_char)
if not new_char_check:
t_chars[t_char] = 1
else:
t_chars[t_char] += 1
return True if s_chars == t_chars else False
class NeetCodeSolution:
def isAnagram(self, s: str, t: str) -> bool:
if len(s) != len(t):
return False
countS, countT = {}, {}
for i in range(len(s)):
countS[s[i]] = 1 + countS.get(s[i], 0)
countT[t[i]] = 1 + countT.get(t[i], 0)
return countS == countT
entry_1 = {"s": "racecar", "t": "carrace", "expected": True}
entry_2 = {"s": "jar", "t": "jam", "expected": False}
# entry_3 = {"s": "racecar", "t": "carrace", "expected": True}
# entry_4 = {"s": "racecar", "t": "carrace", "expected": True}
# entry_5 = {"s": "racecar", "t": "carrace", "expected": True}
s = Solution()
print(s.isAnagram(entry_1["s"], entry_1["t"]))
print(s.isAnagram(entry_2["s"], entry_2["t"]))

View file

@ -1,21 +0,0 @@
from collections import defaultdict
from typing import Dict, List
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
frequency_hashmap: Dict[int, int] = defaultdict(int)
result_hasmap: Dict[int, int] = defaultdict(int)
for nums_entry in nums:
frequency_hashmap[nums_entry] += 1
if not result_hasmap[frequency_hashmap[nums_entry]]:
result_hasmap[frequency_hashmap[nums_entry]] = nums_entry
return result_hasmap
# return list(result_hasmap.values())[-k:]
s = Solution()
# print(s.topKFrequent(nums=[1, 2, 2, 2, 5, 5, 5, 5, 3, 3, 3, 3, 3], k=2))
# print(s.topKFrequent(nums=[1, 2, 2, 3, 3, 3], k=2))
print(s.topKFrequent(nums=[1, 1, 1, 2, 2, 3], k=2))
# print(s.topKFrequent(nums=[7, 7], k=1))

View file

@ -1,26 +0,0 @@
from typing import List
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(0, len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
class NeetCodeSolution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
prevMap = {} # val -> index
for i, n in enumerate(nums):
diff = target - n
if diff in prevMap:
return [prevMap[diff], i]
prevMap[n] = i
s = Solution()
print(s.twoSum([3, 4, 5, 6, 7], 7))
print(s.twoSum([4, 5, 6], 10))
print(s.twoSum([5, 5], 10))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

7
poetry.lock generated
View file

@ -1,7 +0,0 @@
# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
package = []
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
content-hash = "53f2eabc9c26446fbcc00d348c47878e118afc2054778c3c803a0a8028af27d9"

View file

@ -1,17 +0,0 @@
// Binary Search in C
#include <stdio.h>
int main(void)
{
int r = 0;
int test_array[] = {1,2,5};
int test_result[5];
int k = sizeof(test_array) / sizeof(test_array[0]);
for (int i = 1; i < k; i++) {
r = 10*r + test_array[i];
test_result[i]= r / 2;
r = r % 2;
printf("%d", test_result[i]);
}
}

View file

@ -1,17 +0,0 @@
def calculate_negative_power_of_two(n: int):
result_array = []
for i in range(1, n):
result_array.append(i)
print(result_array)
for k in range(0, n - 1):
r = 0
print(".", end="")
for i in range(0, k):
r = 10 * r + result_array[i]
result_array[i] = r // 2
r = r % 2
print(result_array[i], end="")
result_array[k] = 5
print("5")
calculate_negative_power_of_two(20)

View file

@ -1,12 +0,0 @@
if __name__ == "__main__":
input_array = [3, 1, 2, 5]
result_array = []
r = 0
for index, value in enumerate(input_array):
r = 10 * r + value
result_array.append(r // 2)
r = r % 2
if r != 0:
r = 10 * r
result_array.append(r//2)
print(result_array)

View file

@ -1,4 +0,0 @@
{
"venv": ".venv",
"venvPath": "/home/pro100ton/Documents/development/algos_and_structures"
}