From c270e1595324aec9bab497ae489dab640338e063 Mon Sep 17 00:00:00 2001 From: Lusina <12752833+BrianLusina@users.noreply.github.com> Date: Thu, 13 Nov 2025 09:46:53 +0300 Subject: [PATCH 1/6] refactor(algorithms, graphs, course-schedule): additional alternative solution --- algorithms/graphs/course_schedule/README.md | 90 +++++++++++++++--- algorithms/graphs/course_schedule/__init__.py | 90 +++++++++++++++++- .../images/solution_2_slide_1.png | Bin 0 -> 28565 bytes .../images/solution_2_slide_2.png | Bin 0 -> 24565 bytes .../images/solution_2_slide_3.png | Bin 0 -> 32072 bytes .../images/solution_2_slide_4.png | Bin 0 -> 31557 bytes .../images/solution_2_slide_5.png | Bin 0 -> 32186 bytes .../images/solution_2_slide_6.png | Bin 0 -> 32617 bytes .../images/solution_2_slide_7.png | Bin 0 -> 31449 bytes .../images/solution_2_slide_8.png | Bin 0 -> 30426 bytes .../images/solution_2_slide_9.png | Bin 0 -> 33892 bytes .../course_schedule/test_course_schedule.py | 89 +++++++++++++++++ 12 files changed, 256 insertions(+), 13 deletions(-) create mode 100644 algorithms/graphs/course_schedule/images/solution_2_slide_1.png create mode 100644 algorithms/graphs/course_schedule/images/solution_2_slide_2.png create mode 100644 algorithms/graphs/course_schedule/images/solution_2_slide_3.png create mode 100644 algorithms/graphs/course_schedule/images/solution_2_slide_4.png create mode 100644 algorithms/graphs/course_schedule/images/solution_2_slide_5.png create mode 100644 algorithms/graphs/course_schedule/images/solution_2_slide_6.png create mode 100644 algorithms/graphs/course_schedule/images/solution_2_slide_7.png create mode 100644 algorithms/graphs/course_schedule/images/solution_2_slide_8.png create mode 100644 algorithms/graphs/course_schedule/images/solution_2_slide_9.png create mode 100644 algorithms/graphs/course_schedule/test_course_schedule.py diff --git a/algorithms/graphs/course_schedule/README.md b/algorithms/graphs/course_schedule/README.md index 7807254d..aff5c9b8 100644 --- a/algorithms/graphs/course_schedule/README.md +++ b/algorithms/graphs/course_schedule/README.md @@ -11,29 +11,55 @@ should take to finish all courses. If there are many valid answers, return any of them. If it is impossible to finish all courses, return an empty array. Example 1: - +```text Input: numCourses = 2, prerequisites = [[1,0]] Output: [0,1] Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct -course order is [0,1]. Example 2: +course order is [0,1]. +``` +Example 2: +```text Input: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]] Output: [0,2,1,3] Explanation: There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is [0,1,2,3]. Another -correct ordering is [0,2,1,3]. Example 3: +correct ordering is [0,2,1,3]. +``` +Example 3: +```text Input: numCourses = 1, prerequisites = [] Output: [0] +``` + +Example 4: +```text +Input: numCourses = 3, prerequisites = [[1,0],[2,1]] +Output: [0,1,2] +``` + +Example 5: +```text +Input: numCourses = 3, prerequisites = [[1,0],[2,1],[1,2]] +Output: [] +``` + +Example 6: +```text +Input: numCourses = 5, prerequisites = [[1,0],[2,1],[4,3]] +Output: [0,1,2,3,4] +``` Constraints: -1 <= numCourses <= 2000 0 <= prerequisites.length <= numCourses * (numCourses - 1) -prerequisites[i].length == 2 0 <= ai, bi < numCourses ai != bi All the pairs [ai, bi] are distinct. +- 1 <= numCourses <= 2000 +- 0 <= prerequisites.length <= numCourses * (numCourses - 1) +- prerequisites[i].length == 2 0 <= ai, bi < numCourses ai != bi All the pairs [ai, bi] are distinct. --- -# Solution Breakdown - Using Depth First Search +## Solution 1 Breakdown (Using Depth First Search) Suppose we are at a node in our graph during the depth first traversal. Let's call this node A. @@ -56,7 +82,7 @@ Initialize a stack S that will contain the topologically sorted order of the cou adjacency list using the edge pairs given in the input. An important thing to note about the input for the problem is that a pair such as [a, b] represents that the course b needs to be taken in order to do the course a. This implies an edge of the form b ➔ a. Please take note of this when implementing the algorithm. For each of the nodes in our graph, we -will run a depth first search in case that node was not already visited in some other node's DFS traversal. Suppose we +will run a depth-first search in case that node was not already visited in some other node's DFS traversal. Suppose we are executing the depth first search for a node N. We will recursively traverse all of the neighbors of node N which have not been processed before. Once the processing of all the neighbors is done, we will add the node N to the stack. We are making use of a stack to simulate the ordering we need. When we add the node N to the stack, all the nodes that @@ -65,10 +91,14 @@ processed, we will simply return the nodes as they are present in the stack from ## Complexity Analysis -Time Complexity: O(V+E) where V represents the number of vertices and E represents the number of edges. -Essentially we iterate through each node and each vertex in the graph once and only once. +### Time Complexity + +O(V+E) where V represents the number of vertices and E represents the number of edges. Essentially we iterate through +each node and each vertex in the graph once and only once. -Space Complexity: O(V+E). +### Space Complexity: + +O(V+E). We use the adjacency list to represent our graph initially. The space occupied is defined by the number of edges because for each node as the key, we have all its adjacent nodes in the form of a list as the value. Hence, O(E) @@ -76,4 +106,42 @@ for each node as the key, we have all its adjacent nodes in the form of a list a Additionally, we apply recursion in our algorithm, which in worst case will incur O(E) extra space in the function call stack. -To sum up, the overall space complexity is O(V+E). \ No newline at end of file +To sum up, the overall space complexity is O(V+E). + +--- + +## Solution 2 Breakdown + +Initialize the hash map with the vertices and their children. We’ll use another hash map to keep track of the number of +in-degrees of each vertex. Then we’ll find the source vertex (with 0 in-degree) and increment the counter. Retrieve the +source node’s children and add them to the queue. Decrement the in-degrees of the retrieved children. We’ll check +whether the in-degree of the child vertex becomes equal to zero, and we increment the counter. Repeat the process until +the queue is empty. + +> Note: The in-degree is the number of edges coming into a vertex in a directed graph. + +The primary purpose of finding a vertex with 0 in-degree is to find a course with a pre-requisite count of 0. When we +take a course, say a (that is the pre-requisite of another course, say b), we’ll decrement the in-degree of b by 1, and +if the in-degree count becomes 0, we can say that the b’s pre-requisites have been completed. + +The images below illustrate the algorithm above, where num_courses = 6: + +![Solution_2_slide_1](./images/solution_2_slide_1.png) +![Solution_2_slide_2](./images/solution_2_slide_2.png) +![Solution_2_slide_3](./images/solution_2_slide_3.png) +![Solution_2_slide_4](./images/solution_2_slide_4.png) +![Solution_2_slide_5](./images/solution_2_slide_5.png) +![Solution_2_slide_6](./images/solution_2_slide_6.png) +![Solution_2_slide_7](./images/solution_2_slide_7.png) +![Solution_2_slide_8](./images/solution_2_slide_8.png) +![Solution_2_slide_9](./images/solution_2_slide_9.png) + +### Time Complexity + +In the algorithm above, each course will become a source only once, and each edge will be accessed and removed once. +Therefore, the above algorithm’s time complexity will be O(V+E), where V is the total number of vertices and E is the +total number of edges in the graph. + +### Space Complexity + +The space complexity will be O(V+E) because we’re storing all of the edges for each vertex in an adjacency list. diff --git a/algorithms/graphs/course_schedule/__init__.py b/algorithms/graphs/course_schedule/__init__.py index 3ed1597a..add593ab 100644 --- a/algorithms/graphs/course_schedule/__init__.py +++ b/algorithms/graphs/course_schedule/__init__.py @@ -1,5 +1,5 @@ -from collections import defaultdict -from typing import List +from collections import defaultdict, deque +from typing import List, Dict, Deque WHITE = 1 GRAY = 2 @@ -7,35 +7,121 @@ def find_order(num_courses: int, prerequisites: List[List[int]]) -> List[int]: + """ + This function finds the topological sorted order of the courses given the prerequisites. + + Args: + num_courses (int): The total number of courses. + prerequisites (List[List[int]]): A list of tuples where each tuple contains the source and destination of the prerequisite. + + Returns: + List[int]: A list of the courses in the topological sorted order. If there is no valid order, return an empty list. + + """ adjacency_list = defaultdict(list) + # Populate the adjacency list with the prerequisites for destination, source in prerequisites: adjacency_list[source].append(destination) + topological_sorted_order = [] is_possible = True + # Use a dictionary to keep track of the color of each node color = {k: WHITE for k in range(num_courses)} def dfs(node): + """ + This function performs a depth-first search on the graph. + + Args: + node (int): The current node being visited. + + Returns: + None + + """ nonlocal is_possible + # If there is no valid order, return immediately if not is_possible: return + # Mark the current node as gray color[node] = GRAY + # If the current node has any neighbours, visit them if node in adjacency_list: for neighbour in adjacency_list[node]: + # If the neighbour is white, visit it if color[neighbour] == WHITE: dfs(neighbour) + # If the neighbour is gray, there is no valid order elif color[neighbour] == GRAY: is_possible = False + # Mark the current node as black color[node] = BLACK topological_sorted_order.append(node) + # Visit all the nodes for vertex in range(num_courses): if color[vertex] == WHITE: dfs(vertex) + # If there is no valid order, return an empty list return topological_sorted_order[::-1] if is_possible else [] + + +def can_finish( + num_courses: int, + prerequisites: List[List[int]] +) -> bool: + """ + Determines if there is a valid order of courses such that + all prerequisites are satisfied. + + Args: + num_courses (int): The total number of courses. + prerequisites (List[List[int]]): A list of tuples where each tuple contains the source and destination of the prerequisite. + + Returns: + bool: True if there is a valid order, False otherwise. + """ + counter: int = 0 + if num_courses <= 0: + return True + + # Initialize the in-degree of all nodes to 0 + in_degree: Dict[int, int] = {i: 0 for i in range(num_courses)} + # Initialize an adjacency list to store the graph + graph: Dict[int, List[int]] = {i: [] for i in range(num_courses)} + + # Populate the adjacency list and the in-degree of all nodes + for child, parent in prerequisites: + if parent in graph: + graph[parent].append(child) + else: + graph[parent] = [child] + if child in in_degree: + in_degree[child] += 1 + else: + in_degree[child] = 1 + + # Initialize a queue to store all nodes with an in-degree of 0 + sources: Deque[int] = deque() + for key in in_degree: + if in_degree[key] == 0: + sources.append(key) + + # Perform a BFS traversal of the graph + while sources: + course: int = sources.popleft() + counter += 1 + for child in graph[course]: + in_degree[child] -= 1 + if in_degree[child] == 0: + sources.append(child) + + # If all nodes have been visited, return True + return counter == num_courses \ No newline at end of file diff --git a/algorithms/graphs/course_schedule/images/solution_2_slide_1.png b/algorithms/graphs/course_schedule/images/solution_2_slide_1.png new file mode 100644 index 0000000000000000000000000000000000000000..60d94dde9c578940e611e32f89366c853fa34679 GIT binary patch literal 28565 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 uBRQ)MuJ_Lfe^2%ARr~!`|IZ!x literal 0 HcmV?d00001 diff --git a/algorithms/graphs/course_schedule/images/solution_2_slide_2.png b/algorithms/graphs/course_schedule/images/solution_2_slide_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b53ed15623824330078f82c0b4cbb47ceeceb1 GIT binary patch literal 24565 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 Ra+^$BMndsbftZos{{jrm4m1D& literal 0 HcmV?d00001 diff --git a/algorithms/graphs/course_schedule/images/solution_2_slide_4.png b/algorithms/graphs/course_schedule/images/solution_2_slide_4.png new file mode 100644 index 0000000000000000000000000000000000000000..9c628b8e5d27c4194b201f2f01ec2f8e5df784b3 GIT binary patch literal 31557 zcmeFZWmFwY6E;c+?gV%D;1Jw`yGw8l7F;*(5n^UAsM^ZvPO zy{y@54?W$})ivEU)m6{4Llxx25#ey*z`(!|B_%|Zz`(#$z`)+6!$1KgHJdZPfPciy zg@qL)g@uU~>}|f9e=`9CqmJ>6Zj=73h~4jPp>a}<^ZTfG@*3aKEGQw3qiLU2~$(rzN z;9$y~aZ6oiT=>vu2OzWW<9d{Ft!~stW$dbazSnGAAH~Djbl+5H9-FAQtFAKo#CmY^ zuC%U({1+9wgdfw)D5^nF(#hWWnpv$2ULXIb)Sba?6mo{h93P5SLD*Qk&)o);`2{zT z-e(oNU-nrZ1>4=sKw7GeoH4F*2^?%BcT|nTv^}5NKOGf=MwTQRyI$cO37XDEXz#_c zy!M+bF&4@*Kkt)i&#%3cLeUzP-+l4}6su;UA^BBS7K|1+hXH#RYz_tioV^1+xWESt z?EQ}*FlgZW1Mm^a0{{0_@RY3g|2}`0{->glvaqBi@U3iQZ(?HYU}obeeFwG;+-lxj zMZ-};R)*Wi#)`qf*v8O=!PUz4PZKa+S8m|c%EZxt*wyNrwF9>+AL(B;xPkLO#f+rH ze^qg`8Nkr^l&4K^;NX;A_ZMhj4U0hrk zTv!=w>`fV&xwyC(nOGQESm=Qo^bR0vM*~-SYX`EwZ}RW^h?qDS*_+!sn%h_t|GBS$ zp^cLxA1Uddj{fuax11)f=Kt-<+TmZr0tU$V=L#b;0~6za?hQ2M{Zq=VVD4)2?Td)H z6`&rV4}LagR^Gqr|39w$x5t09)c9}9PoF;hv*kao{NG!uI+)lC+gJfzI`aSb$^5JF zKQI2PAur>fk^e&zf2;YgQb5oAaJ-EFd1m}@J-jcOU|@n^k|IJXuJ2CLq0`VsXZpiD zT=0o)$>WK+Bv4#cRs3KTQPHD`X@wwJyQz{;6h~n(AW>0ORQyPVSV%*NrQ*nQij2wk z5$2+8di@B8B) zr3zEV1pgd}Z2%yocomDnf5%1)^k4S=pS?$-WaS*fs6k2nS1aU#qOnf@5J;jE6ibHO8TFY{x_5Ux7_}}wMi%pzUe$J!|UE}1lCNgnGoZowpTln z57!d{CU37Vrs>=7T+ldOFR~bxw+Et3L1Hp|%MCVq3567NXd7^%*Sm>&2^BgmM;%XR zE%F(zTd+9%9*rlfEgW=9eV!{F&sSm3zn5+7GUZ!syd#H0#VrGQA$ngU-(v zDl^;fE;f5`+BsJ6C}mT~T~_RZXUo1Q|7x&d1o~^hFlL*1zTb`-fyC0*r_;H#om$ZI zE3B6f)+?MkKV7{|>c6ctDi)d?OlIRqNoBdEW(yh~7^+jJxWal}bV0MY|NfTDZkf<} zx8^=wtV~s`QvBoja)5|AfVKU{be*~K;aZ!!hsm(K^#zH;5JloW7uq9AyGl0k^Xt=j zHskLm!^^F{$2H|bxra2n-}_YtJrE{g`^91rxHbA+;7t#Eskf|{w0mVz4n>ZAJ)oPl z9ENPF#I4NE`Esq@X=%pz34ynjH%NZ*Lb>#kO1&og{E6h=7aTeF#Kzg2)N9w$h6)8X z#a_`c%(*tp1EF7S?hUPg@@qVwoI#s`SUFnnvGHIvV6;6h`+j6(Fih~>rR^5A>3D#) z*E}AsmRd-_)eWej`2sQM)Z*q!)sG3&fisD@64l))aiVyI9@!}g)+F+rja(#<%}S#k z>DNpU<+~3d>fj{?VIW1lsza%%8>#)nnZnCYQtFHnmD@*Q9BoDek%#-4-tGKv9d9p; zI=3Ni6^c4bhY`5!Qf~*jQPXedZ?E!tg}OI~7TC->W2X|CEGFOiqpDE*qe+B$?^4pu zXA1K5ydHMBJ+vJFk@M(w)iZT}eoJoGyTwf&;ag7Bb(73ot~HI~cfL88x@q@(I^ref zzrB)I*GoO5l1sZ-*>3T7uW0-I>n51UYw=Fyac3yj>E2;~{5DNl@AYsa_@WENTy^y- z<625lzT>hVZ)T1y;08<2gZZT()mp0KxT1v(dFB15jld47Opj@Y^&HW#>B^2*H&4O^ zeL#qV>*Iw=`HrKK(rK**>vXT3LDUI8i+kFac`chcJ0B+|MIzKgV9Hc}^}A4vtZcoK z;=V#wTdFZ}T8kFXhX6sEUlq8Wv9b1mZDNCt%NraCZO3=6n~y7I3Kz=0 zdEYEP*td*VP@wwIQC#AdEF%SRh4O}mHR_L(qcyZRz4XFi2cL(uAL`4{YcJ$EA?hLtm#u(weNXX+XBhcY0r(inCK-;If zAm1C+JY6VHq(jN){(JUTE&|~&Z^=AZCOw18p+GK|hODmKY=RK9gDRgI<`%NwO`GkS zas`v1UZ*ukwAIgQp0U7e)UT0yb>e-u>XN~o=XS=okc+f|yvh6ad`)s(PQafb;pzN2 zJ}liC!3zGWqyXME@O9BBDu3O1*($@RAe?1+jU-E9H^9dkyp<(aqHppgC^vu_{-z1(`q-n zD`xZn$C_)8Lvo5&T;yYj?P%@y=aMK7PuVKBF!=7`s0Lr#?scJAj-Bwk zEl2~1VOTh%f$WcbPbak*a8|lm1-@PEMKFy>jPB2$;2;St*s)YH2kdgONeNq%Y!MK- zbeqleFY%C(;%Ip#V6ZwayIK9PXr{lS!>9Rohqx=^{CN;jSC2O{@~O+u*2_PwO3#<8 z4Ez^B0TGD19JeWuAs6wX;h#5m5xe~L$AumO zx`SOW?*M~yV3}37l@d(oCh^wqt$=U$tvdiV!|2r+B}fwa>>cuq>jorL{~%g-^V{na zJ5L@?hrsK-k$g0z4QC`vUwuJ%ME7MMmY(ZT$WWo;R*Zb!dnW|Mcet3b@-qje#dzFn zuP;xg)VkW?$fS8=At?j7-rLyx+|h*BF+L7ronVKZPG++T6WIsb97jq_iVl*uPJ1Ax z1+TZ4yT^NAIh!FptUeYj-GRD6trF3g7Y$@ZVG1&`kC~u7oQYthNSx|xk8Mrr$rgaV7zK;@kEkaI(#*N2EY*LMu?-|2~ zrei~JO)6`PH#rGZ`{m|!6Fbf!*1HOp!j)u$zh_lDic$LJ#Pe#1>hbyMyu(KB z&}}o7A(q3EE9pvHz5w;+ij-eZ2t?MQCX`}(x>#*=yQ%;EYmuvG{HK|$w%5nw6e3b4 zA_iAQTxK|)qi9tH-E4GOHdl!b8gGXV7Qv~3a;M?6T5HdlZ?0Q?2B%Jt?ri;gbgQ^Q z=j{d-=pGJ)M85O(z=V3cUC?_Zq$Zs=ouyvf+clbw;J)rb7I2NPO?N%v*P~=~{^^T8 zrtnQX62JKRTZShZmKgRZwZ9_L#fgTy!O2hIy)P*oHW{$|FR3=|Q`J~LmqjNYw6L1ImC@q2_X4#D#`+7Yd-&U2qWm8CLyHaIt>ID;m$ zgffUHAB@qBXHWyVqi!_ZubHm`jMPMDINn^LX>DYfj;%qcb|IG zo*+cN#A3gNC+S26jN6=rgviuSRv&IL_L{J;s7>T%6Mq)zl7KdRq4R`;k#f+v6){v$ zkVO!?jzI-dsFNKAA@3B2QxZ|dEG$a+D|C%>+z4*k&%Gtc#*4o*9+gVk?+lWZ7#@wx zGL^2SJnv6ruG4vF)C%dh=AgT_MZLxOZ7w1I%nedAKK)gnqf42CD>ae-)jHFn^OiX- z-p$UUqQpg%Ncnr=&DrX*gM1c299geRMT(N!?d8Mu{&BfQ_zmXU?oh0_%0zC4DNNY3 z#asz!Jej5Q9d@)3idcj7>Wx>{Tc>Ku#Y~S$yJ6L`UdLk%66J zo29N$kCNVP>%l%0)dfBz8qY)nXneWOeET*W3QnD-A&390Rc<+yDt97L9RlYW^?SLw zv}V17+@bPSA3lN`>|p8v}{p--{CEn)M>GeUnyN_VzV^ z;W|T%S9j3K`9R7rU%vd)H95*h#*%&c_24_{vz4ZDMb4Ti=fy#;{j}V5d9(G|f$}(7RjCP( zdRwghS<`;X$g_2}P3I!?BlzA>&pooiBC2xX34f(?cX&U0g(BNjba9hYj$2ZlJ6R`< zVopFXYGm#t$57^+->Y{LO4Dw z@Vh8V&5q{f5S@^*xJnq*E(%DqwslEZt<_3F>}{1rj1-D`eC@$}9oYdzn-+&txxram znV!Qn~`_jID+JEe>x7G@3Ln86YqhgIHEp9O@Dl^pnh{2$}=*BtoRPb%I_PsjG zd?FM$gF==M(mF4E*T=V0{`Gq%9}PXYN1w5`lYXNk{k%*@o}n9)Fl0Iygc%mvAkVMA zvh(uD3DVDNjrpt-O|u-I_Sh$#Vz|%n^f)~LPpDX!QZ5#{{2U846$??phuMJ06cp{V5?&%Z}=?8WV+0QMuhO zx_%lBAPG^)QNtGU2f-~5T_?|cN|RCasmgXNB2o2Jb7F<3#iA`^8AahuQqaHn5SWu6 z)cQW)!|_~(n&xm>4;9*K;4XNqQgR8}X{ zMyTaxw7Ha?>~6nitLpdVV$~Yo37s2#g+z>2ot~b)k-y2~znxW{S2jJ}-c%OW&e*nC z)V}L>L%LrQn!ufoBoygAm1ky0WY*S-XVhCmgBu1joIc=+86vom$~Ev;{lrg5Z1F2d z?T8h}Sj3vug9R{Xw=b^jSa~nOA z#XFCz_00=dRR-r}=Gfo*>Bzp*Hg}E6yE}LSVh^*nHC`OueJQApgT^W{g+Vwb!v`;$ z_UyS-`{^zj`+O$cx#0PtV^0fGlxvyTqHJW6jmVFFl}T(V+nclEXku#LYE4D+Hv3`w zB)?D{S>JsfO9?%UU=|K9RV(MFgPWPLn-4|67rf&X8N;|aLREHX6&aJC8LyPJ9cB{m zsAJ~!Be6zsz%_wfC<0MDDzz4QK(+<7V~pOVkcxhXiIZKaM6jv*451eywh@BoN8+y6 zWr1y>8+yK3>$NS^pO~OJ97mJ8?dNCNn0l@7u^hRLWowGB=>jo?#Pg;(Cy^s=10G9w zCaFdr1EIXAiBqY~&B=2Sfh@_AsTWb`{EJvG!h=CY{`mzty`IRL$5GA4 z3u$rlaQ{i%RnR1%G_*Ly^JCVc+v;l4EFxya;0{yig?&x{ zzNrOfA{imiT@)CBGa``d8^33c?Tpxrgq^|8D*DV3TsJ}*U{ensY>AKW|AaFqXhw!L z7nT#%rTL52*2u^5GC1^F%{SYxBYXr_jA2k9YlS)^?D4MGT|_Ca_Ijy$Wo?BJ zt{oDT5RZfOl7Ub#QqAT22hI@3LL$^1$Dm+PY zzuiLtsc|7>)8AdSXIqlWE0_i9Gj@UYW+cqFE`&SHKcwwvFW!265OKy7jb_>!LqJsD&4kXC;*&SM# z`ua=|&%9R;XEV*F1+A#9R#^^aLQjV!NaVcr8i@gx+RPyu3)?eWwyy;e#56D(;e6%i z(hmALc}AkQmn`DC_l3jY@vn_3O9s&_*E5c^-EpnCBTOswRM2L6xZ}nI_WMnp(DkAy z+iEkb<1#CcEH^wk&zmuCHt)BE@8YcU2>pBns8Jq9*?SvQl) zStzgE+idP7N{^XNO4nL9yS{{GX)3~Ygzb$Btwkt|gr9as0z&E0 z<*6CO9{fHSt0rwCf-PjnurVZg%zX3e$t*UPk;S)NGW?jD-MQiWX}>D4+q#|~A&!H0 za>H8WcJ%0Kzz&UYoCK*cn`yw7Frn=paoq~Vw%4Whf#hfA9xvziYc4#;kPW;gX{ z;~{||I{ZmnHt)JI@gageuFn?o+eTz}V$5aB{<#s!3MZM90B6=F3*WGFci=Qq{(PjL zIaRA|WtTYkuo9wYAOdYJV9M==%=oI&T-2pn zQ#YHfpTZ0uFz!Cmra9C8Wvb@YuK|3NRG=`E_J!D|LWwJM-MrD3Sh$n1vo}^XbmP4Zrv5-Hd zPRueD5w#c#JrF{olLCV2T>K#oZPcOrS#eI``y#M|R4F-x&)}K0P56ChPTA-# zN4^nxWOs4p3(EQ7wr`(gFXCz>4ghtcGDvlA-(w0^RE*fgaK*Eip) zjm61n4gQlf-Uu z&a0zoEA#1(C?e5u>8Jb3%f-tYh zMj2U}P>L-&zJ{(nh#UtVkGkavxikA48IazM)*{r5?VXp8fy z$B8NSryjo$%ry^m;=GE9mPt0nPKJA0`% z^B_U~&dC(ydbzT299FSeIKf}2T*J5~gc2Fvub@-j1zVw}+;6i-e7X$*TV-mU7qfJh zX&0)Y+3WVZ!-uUo;R@c-VtQS(NC++d@JE=9nw9W

7A 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 literal 0 HcmV?d00001 diff --git a/algorithms/graphs/course_schedule/images/solution_2_slide_6.png b/algorithms/graphs/course_schedule/images/solution_2_slide_6.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7dc96938a77dc31ed06d7785cfcd6aaead423d GIT binary patch literal 32617 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 F{|{|S(+U6p literal 0 HcmV?d00001 diff --git a/algorithms/graphs/course_schedule/images/solution_2_slide_8.png b/algorithms/graphs/course_schedule/images/solution_2_slide_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8faf9742564a183131a6acfb232c209152d44f9f GIT binary patch literal 30426 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�Zuoi-RSiAX@q6*!K875BW4Q9Zs30uql-a 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≶_O)r?cPJAC1A;i-@yEwh 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 X>HCspK`<-uBKM@l6~u}~^nCvZB+Z=k literal 0 HcmV?d00001 diff --git a/algorithms/graphs/course_schedule/test_course_schedule.py b/algorithms/graphs/course_schedule/test_course_schedule.py new file mode 100644 index 00000000..205c551b --- /dev/null +++ b/algorithms/graphs/course_schedule/test_course_schedule.py @@ -0,0 +1,89 @@ +import unittest +from . import find_order, can_finish + + +class FindOrderTestCase(unittest.TestCase): + def test_1(self): + num_courses = 2 + prerequisites = [[1,0]] + expected = [0, 1] + actual = find_order(num_courses=num_courses, prerequisites=prerequisites) + self.assertEqual(expected, actual) + + def test_2(self): + num_courses = 4 + prerequisites = [[1,0],[2,0],[3,1],[3,2]] + expected = [0,2,1,3] + actual = find_order(num_courses=num_courses, prerequisites=prerequisites) + self.assertEqual(expected, actual) + + + def test_3(self): + num_courses = 1 + prerequisites = [] + expected = [0] + actual = find_order(num_courses=num_courses, prerequisites=prerequisites) + self.assertEqual(expected, actual) + + def test_4(self): + num_courses = 3 + prerequisites = [[1,0],[2,1]] + expected = [0,1,2] + actual = find_order(num_courses=num_courses, prerequisites=prerequisites) + self.assertEqual(expected, actual) + + def test_5(self): + num_courses = 3 + prerequisites = [[1,0],[2,1],[1,2]] + expected = [] + actual = find_order(num_courses=num_courses, prerequisites=prerequisites) + self.assertEqual(expected, actual) + + def test_6(self): + num_courses = 3 + prerequisites = [[1,0],[2,1],[4,3]] + expected = [0,1,2] # or [0,1,2,3,4] + actual = find_order(num_courses=num_courses, prerequisites=prerequisites) + self.assertEqual(expected, actual) + + +class CanFinishTestCases(unittest.TestCase): + def test_1(self): + num_courses = 2 + prerequisites = [[1,0]] + actual = can_finish(num_courses=num_courses, prerequisites=prerequisites) + self.assertTrue(actual) + + def test_2(self): + num_courses = 4 + prerequisites = [[1,0],[2,0],[3,1],[3,2]] + actual = can_finish(num_courses=num_courses, prerequisites=prerequisites) + self.assertTrue(actual) + + def test_3(self): + num_courses = 1 + prerequisites = [] + actual = can_finish(num_courses=num_courses, prerequisites=prerequisites) + self.assertTrue(actual) + + def test_4(self): + num_courses = 3 + prerequisites = [[1,0],[2,1]] + actual = can_finish(num_courses=num_courses, prerequisites=prerequisites) + self.assertTrue(actual) + + def test_5(self): + num_courses = 3 + prerequisites = [[1,0],[2,1],[1,2]] + actual = can_finish(num_courses=num_courses, prerequisites=prerequisites) + self.assertFalse(actual) + + def test_6(self): + num_courses = 3 + prerequisites = [[1,0],[2,1],[4,3]] + actual = can_finish(num_courses=num_courses, prerequisites=prerequisites) + self.assertTrue(actual) + + +if __name__ == '__main__': + unittest.main() From 617ab629df7c8af14c81a0372a6d9a1243f5bfcc Mon Sep 17 00:00:00 2001 From: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Date: Thu, 13 Nov 2025 06:47:32 +0000 Subject: [PATCH 2/6] updating DIRECTORY.md --- DIRECTORY.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 495f67b4..d612b6d8 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -75,6 +75,9 @@ * [Test Find Duplicate](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/fast_and_slow/find_duplicate/test_find_duplicate.py) * Happy Number * [Test Happy Number](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/fast_and_slow/happy_number/test_happy_number.py) + * Graphs + * Course Schedule + * [Test Course Schedule](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/graphs/course_schedule/test_course_schedule.py) * Greedy * Min Arrows * [Test Find Min Arrows](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/greedy/min_arrows/test_find_min_arrows.py) From 396709ae1bac39b6b58d9d004ac664b523d7eb57 Mon Sep 17 00:00:00 2001 From: Lusina <12752833+BrianLusina@users.noreply.github.com> Date: Thu, 13 Nov 2025 10:02:43 +0300 Subject: [PATCH 3/6] ci(github): update pre-commit workflow versions --- .github/workflows/pre-commit.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index a05b67a2..bdd3ea4e 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -6,8 +6,8 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/cache@v2 + - uses: actions/checkout@v5 + - uses: actions/cache@v4 with: path: | ~/.cache/pre-commit From 8641f40e8e89f65584bc6588a63d5dc4c72f3dc3 Mon Sep 17 00:00:00 2001 From: Lusina <12752833+BrianLusina@users.noreply.github.com> Date: Thu, 13 Nov 2025 10:03:46 +0300 Subject: [PATCH 4/6] docs(readme): add codacy badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 45c510c0..f45b962f 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ ## Python Snippets [![Build Status](https://travis-ci.org/BrianLusina/Python_Snippets.svg?branch=master)](https://travis-ci.org/BrianLusina/Python_Snippets) +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/11cfc8e125c54bdb833fe19ed9ddad72)](https://app.codacy.com/gh/BrianLusina/Python_Snippets/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) Repository for some of my simple [Python](https://www.python.org/ "Python") functions and snippets. Each directory and/or python package has a readme for more information about the Python program From 0ef2896dda9aa8d6ddf1b6e3daf0ec73a5072c26 Mon Sep 17 00:00:00 2001 From: Lusina <12752833+BrianLusina@users.noreply.github.com> Date: Thu, 13 Nov 2025 10:06:28 +0300 Subject: [PATCH 5/6] chore(lint): format fixes --- .../arrays/intersection/intersection_two.py | 9 +- .../test_non_constructible_change.py | 13 +-- .../test_optimal_task_assignment.py | 2 +- .../arrays/sorted_squared_array/__init__.py | 4 +- .../test_sorted_squared_array.py | 10 +- algorithms/arrays/subsequence/__init__.py | 1 + .../subsequence/test_is_valid_subsequence.py | 27 +++--- .../test_circular_array_loop.py | 18 ++-- .../find_duplicate/test_find_duplicate.py | 6 +- .../fast_and_slow/happy_number/__init__.py | 1 + .../happy_number/test_happy_number.py | 3 +- algorithms/graphs/course_schedule/__init__.py | 7 +- .../course_schedule/test_course_schedule.py | 29 +++--- .../josephus_circle/test_josephus_circle.py | 2 +- .../repeated_dna_sequences/__init__.py | 29 ++++-- .../test_repeated_dna_sequences.py | 8 +- .../find_sum_of_three/__init__.py | 4 +- .../test_find_sum_of_three.py | 10 +- .../test_pair_with_sum_in_array.py | 2 +- .../reverse_array/test_reverse_array.py | 4 +- .../two_pointers/sort_colors/__init__.py | 1 + .../sort_colors/test_sort_colors.py | 45 +++++---- .../test_arbitrary_precision_increment.py | 2 +- .../test_array_advance_game.py | 2 +- .../arrays/matrix/settozero/__init__.py | 4 +- .../matrix/settozero/test_set_matrix_zero.py | 30 ++++-- .../test_subarrays_with_fixed_bounds.py | 14 +-- datastructures/linked_lists/__init__.py | 7 +- .../linked_lists/circular/__init__.py | 1 - datastructures/linked_lists/circular/node.py | 4 +- .../circular/test_circular_linked_list.py | 2 +- .../doubly_linked_list/__init__.py | 1 - .../linked_lists/doubly_linked_list/node.py | 10 +- .../mergeklinkedlists/__init__.py | 4 +- .../mergeklinkedlists/test_merge.py | 8 +- .../singly_linked_list/__init__.py | 4 +- ...singly_linked_list_remove_nth_last_node.py | 19 ++-- .../test_singly_linked_palindrome.py | 23 ++--- datastructures/trees/__init__.py | 2 +- datastructures/trees/binary/node.py | 10 +- .../trees/binary/search_tree/__init__.py | 18 ++-- .../test_binary_search_tree_insert.py | 8 +- datastructures/trees/binary/tree/__init__.py | 40 ++++---- .../trees/binary/tree/test_binary_tree.py | 49 +++++++--- .../test_tournament_winner.py | 5 +- puzzles/permutations_check/__init__.py | 5 +- puzzles/permutations_check/test_check.py | 26 +++-- .../__init__.py | 2 +- .../test_recursive_multiply.py | 7 +- .../cyclically_shifted_array/__init__.py | 1 + .../test_cyclically_shifted_array.py | 3 +- .../test_find_closest_number.py | 2 +- .../test_find_closest_value.py | 29 +++--- .../find_first_in_duplicate_list/__init__.py | 10 +- .../test_find_first_in_duplicates.py | 3 +- .../test_find_fixed_number.py | 2 +- .../test_integer_square_root.py | 2 +- .../test_decimal_to_binary.py | 2 +- .../reverse_string/test_reverse_string.py | 2 +- pystrings/anagram/__init__.py | 1 - pystrings/anagram/group_anagrams/__init__.py | 5 +- .../group_anagrams/test_group_anagrams.py | 94 ++++++++++++++----- pystrings/count_consonants/__init__.py | 4 +- .../count_consonants/test_count_consonants.py | 7 +- pystrings/inttostr/__init__.py | 8 +- pystrings/inttostr/test_int_to_str.py | 2 +- pystrings/is_unique/test_is_unique.py | 7 +- pystrings/look_and_say_sequence/__init__.py | 2 +- .../test_look_and_say_sequence.py | 2 +- .../test_permutation_palindrome.py | 2 +- pystrings/permutation/__init__.py | 1 + .../permutation/test_check_permutation.py | 3 +- pystrings/spreadsheet_encoding/__init__.py | 2 +- .../test_spreadsheet_encode.py | 4 +- pystrings/string_length/__init__.py | 3 +- pystrings/string_length/test_string_length.py | 2 +- pystrings/strtoint/__init__.py | 13 +-- pystrings/strtoint/test_string_to_int.py | 2 +- 78 files changed, 447 insertions(+), 315 deletions(-) diff --git a/algorithms/arrays/intersection/intersection_two.py b/algorithms/arrays/intersection/intersection_two.py index ad22c60b..6ef0ce3d 100644 --- a/algorithms/arrays/intersection/intersection_two.py +++ b/algorithms/arrays/intersection/intersection_two.py @@ -3,7 +3,9 @@ T = TypeVar("T") -def intersect(list_one: List[T], list_two: List[T], include_duplicates: bool = True) -> List[T]: +def intersect( + list_one: List[T], list_two: List[T], include_duplicates: bool = True +) -> List[T]: """ Given two arrays, find their intersection. This assumes that the lists are not sorted. First sorting takes place on both lists which will incur a cost of O(nlog(n)) + O(mlog(m)) depending on the algorithm used. Time will also @@ -35,7 +37,10 @@ def intersect(list_one: List[T], list_two: List[T], include_duplicates: bool = T if include_duplicates: result.append(first_element) else: - if pointer_one == 0 or first_element != sorted_list_one[pointer_one - 1]: + if ( + pointer_one == 0 + or first_element != sorted_list_one[pointer_one - 1] + ): result.append(first_element) pointer_one += 1 pointer_two += 1 diff --git a/algorithms/arrays/non_constructible_change/test_non_constructible_change.py b/algorithms/arrays/non_constructible_change/test_non_constructible_change.py index 0963b12c..06a08be9 100644 --- a/algorithms/arrays/non_constructible_change/test_non_constructible_change.py +++ b/algorithms/arrays/non_constructible_change/test_non_constructible_change.py @@ -95,11 +95,12 @@ def test_13(self): self.assertEqual(actual, expected) def test_input_not_mutated(self): - """should not mutate the input coins list""" - coins = [5, 7, 1, 1, 2, 3, 22] - snapshot = coins[:] - _ = non_constructible_change(coins) - self.assertEqual(coins, snapshot) + """should not mutate the input coins list""" + coins = [5, 7, 1, 1, 2, 3, 22] + snapshot = coins[:] + _ = non_constructible_change(coins) + self.assertEqual(coins, snapshot) + -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/algorithms/arrays/optimal_task_assignment/test_optimal_task_assignment.py b/algorithms/arrays/optimal_task_assignment/test_optimal_task_assignment.py index c3a3a2d3..50bb187c 100644 --- a/algorithms/arrays/optimal_task_assignment/test_optimal_task_assignment.py +++ b/algorithms/arrays/optimal_task_assignment/test_optimal_task_assignment.py @@ -11,5 +11,5 @@ def test_1(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/algorithms/arrays/sorted_squared_array/__init__.py b/algorithms/arrays/sorted_squared_array/__init__.py index 454a5b89..1639cbbf 100644 --- a/algorithms/arrays/sorted_squared_array/__init__.py +++ b/algorithms/arrays/sorted_squared_array/__init__.py @@ -20,7 +20,7 @@ def sorted_squared_array(array: List[int]) -> List[int]: left, right = 0, n - 1 # file result array from right to left (largest to smallest squares - for i in range(n-1, -1, -1): + for i in range(n - 1, -1, -1): left_abs = abs(array[left]) right_abs = abs(array[right]) @@ -56,7 +56,7 @@ def sorted_squared_array_2(array: List[int]) -> List[int]: left, right = 0, n - 1 # file result array from right to left (largest to smallest squares - for i in range(n-1, -1, -1): + for i in range(n - 1, -1, -1): left_square = array[left] ** 2 right_square = array[right] ** 2 diff --git a/algorithms/arrays/sorted_squared_array/test_sorted_squared_array.py b/algorithms/arrays/sorted_squared_array/test_sorted_squared_array.py index 5e2efab7..ee1e12a8 100644 --- a/algorithms/arrays/sorted_squared_array/test_sorted_squared_array.py +++ b/algorithms/arrays/sorted_squared_array/test_sorted_squared_array.py @@ -19,8 +19,8 @@ def test_2(self): def test_3(self): """for an input of [-7,-3,2,3,11] it should return [4,9,9,49,121]""" - input_array = [-7,-3,2,3,11] - expected = [4,9,9,49,121] + input_array = [-7, -3, 2, 3, 11] + expected = [4, 9, 9, 49, 121] actual = sorted_squared_array(input_array) self.assertEqual(expected, actual) @@ -42,11 +42,11 @@ def test_2(self): def test_3(self): """for an input of [-7,-3,2,3,11] it should return [4,9,9,49,121]""" - input_array = [-7,-3,2,3,11] - expected = [4,9,9,49,121] + input_array = [-7, -3, 2, 3, 11] + expected = [4, 9, 9, 49, 121] actual = sorted_squared_array_2(input_array) self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/algorithms/arrays/subsequence/__init__.py b/algorithms/arrays/subsequence/__init__.py index bc23c8be..fa0267f5 100644 --- a/algorithms/arrays/subsequence/__init__.py +++ b/algorithms/arrays/subsequence/__init__.py @@ -37,6 +37,7 @@ def is_valid_subsequence(array: List[int], sequence: List[int]) -> bool: return False + def is_valid_subsequence_v2(array: List[int], sequence: List[int]) -> bool: """ Returns true if a sequence is a subsequence of the provided array diff --git a/algorithms/arrays/subsequence/test_is_valid_subsequence.py b/algorithms/arrays/subsequence/test_is_valid_subsequence.py index dc6728c9..3d741b76 100644 --- a/algorithms/arrays/subsequence/test_is_valid_subsequence.py +++ b/algorithms/arrays/subsequence/test_is_valid_subsequence.py @@ -12,32 +12,33 @@ def test_1(self): def test_2(self): """should return True for array = [5, 1, 22, 25, 6, -1, 8, 10], sequence = [5, 1, 22, 6, -1, 8, 10]""" - array = [5, 1, 22, 25, 6, -1, 8, 10] + array = [5, 1, 22, 25, 6, -1, 8, 10] sequence = [5, 1, 22, 6, -1, 8, 10] actual = is_valid_subsequence(array, sequence) self.assertTrue(actual) def test_3(self): """should return False for array = [5, 1, 22, 25, 6, -1, 8, 10], sequence = [5, 6, 1, 10, 22, 8, -1, 25]""" - array = [5, 1, 22, 25, 6, -1, 8, 10] + array = [5, 1, 22, 25, 6, -1, 8, 10] sequence = [5, 6, 1, 10, 22, 8, -1, 25] actual = is_valid_subsequence(array, sequence) self.assertFalse(actual) def test_4(self): """should return True for array = [1,2,3,4], sequence = [1,3,4]""" - array = [1,2,3,4] - sequence = [1,3,4] + array = [1, 2, 3, 4] + sequence = [1, 3, 4] actual = is_valid_subsequence(array, sequence) self.assertTrue(actual) def test_5(self): """should return True for array = [1,2,3,4], sequence = [2,4]""" - array = [1,2,3,4] - sequence = [2,4] + array = [1, 2, 3, 4] + sequence = [2, 4] actual = is_valid_subsequence(array, sequence) self.assertTrue(actual) + class IsValidSubsequenceV2TestCase(unittest.TestCase): def test_1(self): """array = [5, 1, 22, 25, 6, -1, 8, 10], sequence = [1, 6, -1, 10]""" @@ -48,32 +49,32 @@ def test_1(self): def test_2(self): """should return True for array = [5, 1, 22, 25, 6, -1, 8, 10], sequence = [5, 1, 22, 6, -1, 8, 10]""" - array = [5, 1, 22, 25, 6, -1, 8, 10] + array = [5, 1, 22, 25, 6, -1, 8, 10] sequence = [5, 1, 22, 6, -1, 8, 10] actual = is_valid_subsequence_v2(array, sequence) self.assertTrue(actual) def test_3(self): """should return False for array = [5, 1, 22, 25, 6, -1, 8, 10], sequence = [5, 6, 1, 10, 22, 8, -1, 25]""" - array = [5, 1, 22, 25, 6, -1, 8, 10] + array = [5, 1, 22, 25, 6, -1, 8, 10] sequence = [5, 6, 1, 10, 22, 8, -1, 25] actual = is_valid_subsequence_v2(array, sequence) self.assertFalse(actual) def test_4(self): """should return True for array = [1,2,3,4], sequence = [1,3,4]""" - array = [1,2,3,4] - sequence = [1,3,4] + array = [1, 2, 3, 4] + sequence = [1, 3, 4] actual = is_valid_subsequence_v2(array, sequence) self.assertTrue(actual) def test_5(self): """should return True for array = [1,2,3,4], sequence = [2,4]""" - array = [1,2,3,4] - sequence = [2,4] + array = [1, 2, 3, 4] + sequence = [2, 4] actual = is_valid_subsequence_v2(array, sequence) self.assertTrue(actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/algorithms/fast_and_slow/circular_array_loop/test_circular_array_loop.py b/algorithms/fast_and_slow/circular_array_loop/test_circular_array_loop.py index a5fba49a..79cc4d39 100644 --- a/algorithms/fast_and_slow/circular_array_loop/test_circular_array_loop.py +++ b/algorithms/fast_and_slow/circular_array_loop/test_circular_array_loop.py @@ -5,7 +5,7 @@ class CircularArrayLoopTestCase(unittest.TestCase): def test_1(self): """should return True for [3,1,2]""" - nums = [3,1,2] + nums = [3, 1, 2] actual = circular_array_loop(nums) self.assertTrue(actual) @@ -17,46 +17,46 @@ def test_2(self): def test_3(self): """should return False for [2,1,-1,-2]""" - nums = [2,1,-1,-2] + nums = [2, 1, -1, -2] actual = circular_array_loop(nums) self.assertFalse(actual) def test_4(self): """should return True for [3,-3,1,1]""" - nums = [3,-3,1,1] + nums = [3, -3, 1, 1] actual = circular_array_loop(nums) self.assertTrue(actual) def test_5(self): """should return True for [1,3,-2,-4,1]""" - nums = [1,3,-2,-4,1] + nums = [1, 3, -2, -4, 1] actual = circular_array_loop(nums) self.assertTrue(actual) def test_6(self): """should return True for [2,1,-1,-2]""" - nums = [2,1,-1,-2] + nums = [2, 1, -1, -2] actual = circular_array_loop(nums) self.assertFalse(actual) def test_7(self): """should return True for [5,4,-2,-1,3]""" - nums = [5,4,-2,-1,3] + nums = [5, 4, -2, -1, 3] actual = circular_array_loop(nums) self.assertFalse(actual) def test_8(self): """should return True for [1,2,-3,3,4,7,1]""" - nums = [1,2,-3,3,4,7,1] + nums = [1, 2, -3, 3, 4, 7, 1] actual = circular_array_loop(nums) self.assertTrue(actual) def test_9(self): """should return True for [3,3,1,-1,2]""" - nums = [3,3,1,-1,2] + nums = [3, 3, 1, -1, 2] actual = circular_array_loop(nums) self.assertTrue(actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/algorithms/fast_and_slow/find_duplicate/test_find_duplicate.py b/algorithms/fast_and_slow/find_duplicate/test_find_duplicate.py index 08a39ce0..0e8b7e9f 100644 --- a/algorithms/fast_and_slow/find_duplicate/test_find_duplicate.py +++ b/algorithms/fast_and_slow/find_duplicate/test_find_duplicate.py @@ -124,7 +124,7 @@ def test_10(self): def test_11(self): """nums = [1,3,4,2,2] should return 2""" - nums = [1,3,4,2,2] + nums = [1, 3, 4, 2, 2] expected = 2 actual = find_duplicate_floyd_algo(nums) @@ -133,7 +133,7 @@ def test_11(self): def test_12(self): """nums = [1,3,6,2,7,3,5,4] should return 3""" - nums = [1,3,6,2,7,3,5,4] + nums = [1, 3, 6, 2, 7, 3, 5, 4] expected = 3 actual = find_duplicate_floyd_algo(nums) @@ -142,7 +142,7 @@ def test_12(self): def test_13(self): """nums = [1,2,2] should return 2""" - nums = [1,2,2] + nums = [1, 2, 2] expected = 2 actual = find_duplicate_floyd_algo(nums) diff --git a/algorithms/fast_and_slow/happy_number/__init__.py b/algorithms/fast_and_slow/happy_number/__init__.py index ba4c0a3b..51f80db1 100644 --- a/algorithms/fast_and_slow/happy_number/__init__.py +++ b/algorithms/fast_and_slow/happy_number/__init__.py @@ -35,6 +35,7 @@ def get_next(number: int) -> int: return n == 1 + def is_happy_number_2(n: int) -> bool: """ Checks if an unsigned integer is a happy number diff --git a/algorithms/fast_and_slow/happy_number/test_happy_number.py b/algorithms/fast_and_slow/happy_number/test_happy_number.py index 38a5fb20..2cdc8bb6 100644 --- a/algorithms/fast_and_slow/happy_number/test_happy_number.py +++ b/algorithms/fast_and_slow/happy_number/test_happy_number.py @@ -57,6 +57,7 @@ def test_9(self): actual = is_happy_number(number) self.assertFalse(actual) + class HappyNumberTestCase2(unittest.TestCase): def test_1(self): """should return true for 23""" @@ -113,5 +114,5 @@ def test_9(self): self.assertFalse(actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/algorithms/graphs/course_schedule/__init__.py b/algorithms/graphs/course_schedule/__init__.py index add593ab..59a8dc04 100644 --- a/algorithms/graphs/course_schedule/__init__.py +++ b/algorithms/graphs/course_schedule/__init__.py @@ -73,10 +73,7 @@ def dfs(node): return topological_sorted_order[::-1] if is_possible else [] -def can_finish( - num_courses: int, - prerequisites: List[List[int]] -) -> bool: +def can_finish(num_courses: int, prerequisites: List[List[int]]) -> bool: """ Determines if there is a valid order of courses such that all prerequisites are satisfied. @@ -124,4 +121,4 @@ def can_finish( sources.append(child) # If all nodes have been visited, return True - return counter == num_courses \ No newline at end of file + return counter == num_courses diff --git a/algorithms/graphs/course_schedule/test_course_schedule.py b/algorithms/graphs/course_schedule/test_course_schedule.py index 205c551b..2563a499 100644 --- a/algorithms/graphs/course_schedule/test_course_schedule.py +++ b/algorithms/graphs/course_schedule/test_course_schedule.py @@ -5,19 +5,18 @@ class FindOrderTestCase(unittest.TestCase): def test_1(self): num_courses = 2 - prerequisites = [[1,0]] + prerequisites = [[1, 0]] expected = [0, 1] actual = find_order(num_courses=num_courses, prerequisites=prerequisites) self.assertEqual(expected, actual) def test_2(self): num_courses = 4 - prerequisites = [[1,0],[2,0],[3,1],[3,2]] - expected = [0,2,1,3] + prerequisites = [[1, 0], [2, 0], [3, 1], [3, 2]] + expected = [0, 2, 1, 3] actual = find_order(num_courses=num_courses, prerequisites=prerequisites) self.assertEqual(expected, actual) - def test_3(self): num_courses = 1 prerequisites = [] @@ -27,22 +26,22 @@ def test_3(self): def test_4(self): num_courses = 3 - prerequisites = [[1,0],[2,1]] - expected = [0,1,2] + prerequisites = [[1, 0], [2, 1]] + expected = [0, 1, 2] actual = find_order(num_courses=num_courses, prerequisites=prerequisites) self.assertEqual(expected, actual) def test_5(self): num_courses = 3 - prerequisites = [[1,0],[2,1],[1,2]] + prerequisites = [[1, 0], [2, 1], [1, 2]] expected = [] actual = find_order(num_courses=num_courses, prerequisites=prerequisites) self.assertEqual(expected, actual) def test_6(self): num_courses = 3 - prerequisites = [[1,0],[2,1],[4,3]] - expected = [0,1,2] # or [0,1,2,3,4] + prerequisites = [[1, 0], [2, 1], [4, 3]] + expected = [0, 1, 2] # or [0,1,2,3,4] actual = find_order(num_courses=num_courses, prerequisites=prerequisites) self.assertEqual(expected, actual) @@ -50,13 +49,13 @@ def test_6(self): class CanFinishTestCases(unittest.TestCase): def test_1(self): num_courses = 2 - prerequisites = [[1,0]] + prerequisites = [[1, 0]] actual = can_finish(num_courses=num_courses, prerequisites=prerequisites) self.assertTrue(actual) def test_2(self): num_courses = 4 - prerequisites = [[1,0],[2,0],[3,1],[3,2]] + prerequisites = [[1, 0], [2, 0], [3, 1], [3, 2]] actual = can_finish(num_courses=num_courses, prerequisites=prerequisites) self.assertTrue(actual) @@ -68,22 +67,22 @@ def test_3(self): def test_4(self): num_courses = 3 - prerequisites = [[1,0],[2,1]] + prerequisites = [[1, 0], [2, 1]] actual = can_finish(num_courses=num_courses, prerequisites=prerequisites) self.assertTrue(actual) def test_5(self): num_courses = 3 - prerequisites = [[1,0],[2,1],[1,2]] + prerequisites = [[1, 0], [2, 1], [1, 2]] actual = can_finish(num_courses=num_courses, prerequisites=prerequisites) self.assertFalse(actual) def test_6(self): num_courses = 3 - prerequisites = [[1,0],[2,1],[4,3]] + prerequisites = [[1, 0], [2, 1], [4, 3]] actual = can_finish(num_courses=num_courses, prerequisites=prerequisites) self.assertTrue(actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/algorithms/josephus_circle/test_josephus_circle.py b/algorithms/josephus_circle/test_josephus_circle.py index 301206ce..63a516b0 100644 --- a/algorithms/josephus_circle/test_josephus_circle.py +++ b/algorithms/josephus_circle/test_josephus_circle.py @@ -60,5 +60,5 @@ def test_5(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/algorithms/sliding_window/repeated_dna_sequences/__init__.py b/algorithms/sliding_window/repeated_dna_sequences/__init__.py index a1e3d4f3..64450743 100644 --- a/algorithms/sliding_window/repeated_dna_sequences/__init__.py +++ b/algorithms/sliding_window/repeated_dna_sequences/__init__.py @@ -19,7 +19,7 @@ def find_repeated_dna_sequences_naive(dna_sequence: str) -> List[str]: result_set = set() seen = set() for idx in range(len(dna_sequence)): - subsequence = dna_sequence[idx:idx+10] + subsequence = dna_sequence[idx : idx + 10] if len(subsequence) < 10: continue if subsequence in seen: @@ -29,6 +29,7 @@ def find_repeated_dna_sequences_naive(dna_sequence: str) -> List[str]: return list(result_set) + def find_repeated_dna_sequences(dna_sequence: str) -> List[str]: """ Finds all repeated DNA sequences in a given string. @@ -43,18 +44,23 @@ def find_repeated_dna_sequences(dna_sequence: str) -> List[str]: """ to_int = {"A": 0, "C": 1, "G": 2, "T": 3} - # Validate input contains only valid DNA bases + # Validate input contains only valid DNA bases if not all(c in to_int for c in dna_sequence): - raise ValueError(f"DNA sequence contains invalid characters. Only A, C, G, T are allowed.") + raise ValueError( + f"DNA sequence contains invalid characters. Only A, C, G, T are allowed." + ) encoded_sequence = [to_int[c] for c in dna_sequence] - dna_sequence_substr_length, dna_sequence_length = 10, len(dna_sequence) # Length of DNA sequence to check + dna_sequence_substr_length, dna_sequence_length = ( + 10, + len(dna_sequence), + ) # Length of DNA sequence to check if dna_sequence_length <= dna_sequence_substr_length: return [] - base_a_encoding = 4 # Base-4 encoding + base_a_encoding = 4 # Base-4 encoding rolling_hash_value = 0 seen_hashes, output = set(), set() a_k = 1 # Stores a^k for hash updates @@ -62,21 +68,24 @@ def find_repeated_dna_sequences(dna_sequence: str) -> List[str]: # # Compute the initial hash using base-4 multiplication for i in range(dna_sequence_substr_length): rolling_hash_value = rolling_hash_value * base_a_encoding + encoded_sequence[i] - a_k *= base_a_encoding # Precompute a^k for later use in rolling hash updates + a_k *= base_a_encoding # Precompute a^k for later use in rolling hash updates - seen_hashes.add(rolling_hash_value) # Store the initial hash + seen_hashes.add(rolling_hash_value) # Store the initial hash # Sliding window approach to update the hash efficiently for start in range(1, dna_sequence_length - dna_sequence_substr_length + 1): # Remove the leftmost character and add the new rightmost character - rolling_hash_value = rolling_hash_value * base_a_encoding - encoded_sequence[start - 1] * a_k + encoded_sequence[start + dna_sequence_substr_length - 1] + rolling_hash_value = ( + rolling_hash_value * base_a_encoding + - encoded_sequence[start - 1] * a_k + + encoded_sequence[start + dna_sequence_substr_length - 1] + ) # If this hash has been seen_hashes before, add the corresponding substring to the output if rolling_hash_value in seen_hashes: - output.add(dna_sequence[start: start + dna_sequence_substr_length]) + output.add(dna_sequence[start : start + dna_sequence_substr_length]) else: seen_hashes.add(rolling_hash_value) # Convert set to list before returning return list(output) - diff --git a/algorithms/sliding_window/repeated_dna_sequences/test_repeated_dna_sequences.py b/algorithms/sliding_window/repeated_dna_sequences/test_repeated_dna_sequences.py index 5460161d..9e4687d4 100644 --- a/algorithms/sliding_window/repeated_dna_sequences/test_repeated_dna_sequences.py +++ b/algorithms/sliding_window/repeated_dna_sequences/test_repeated_dna_sequences.py @@ -29,7 +29,7 @@ def test_4(self): def test_5(self): dna_sequence = "ACGTACGTACGTACGTACGTACGTACGTACGT" - expected = ["ACGTACGTAC","CGTACGTACG","GTACGTACGT","TACGTACGTA"] + expected = ["ACGTACGTAC", "CGTACGTACG", "GTACGTACGT", "TACGTACGTA"] actual = find_repeated_dna_sequences(dna_sequence) self.assertEqual(sorted(expected), sorted(actual)) @@ -39,6 +39,7 @@ def test_6(self): actual = find_repeated_dna_sequences(dna_sequence) self.assertEqual(expected, actual) + class FindRepeatedDnaSequencesNaiveTestCase(unittest.TestCase): def test_1(self): dna_sequence = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" @@ -66,7 +67,7 @@ def test_4(self): def test_5(self): dna_sequence = "ACGTACGTACGTACGTACGTACGTACGTACGT" - expected = ["ACGTACGTAC","CGTACGTACG","GTACGTACGT","TACGTACGTA"] + expected = ["ACGTACGTAC", "CGTACGTACG", "GTACGTACGT", "TACGTACGTA"] actual = find_repeated_dna_sequences_naive(dna_sequence) self.assertEqual(sorted(expected), sorted(actual)) @@ -76,5 +77,6 @@ def test_6(self): actual = find_repeated_dna_sequences_naive(dna_sequence) self.assertEqual(expected, actual) -if __name__ == '__main__': + +if __name__ == "__main__": unittest.main() diff --git a/algorithms/two_pointers/find_sum_of_three/__init__.py b/algorithms/two_pointers/find_sum_of_three/__init__.py index 381e3cb8..4b5f9cd4 100644 --- a/algorithms/two_pointers/find_sum_of_three/__init__.py +++ b/algorithms/two_pointers/find_sum_of_three/__init__.py @@ -17,10 +17,10 @@ def find_sum_of_three(nums: List[int], target: int) -> bool: numbers.sort() for idx, num in enumerate(numbers): - if idx > 0 and num == numbers[idx-1]: + if idx > 0 and num == numbers[idx - 1]: continue - left, right = idx+1, len(numbers) - 1 + left, right = idx + 1, len(numbers) - 1 while left < right: current_sum = num + numbers[left] + numbers[right] diff --git a/algorithms/two_pointers/find_sum_of_three/test_find_sum_of_three.py b/algorithms/two_pointers/find_sum_of_three/test_find_sum_of_three.py index 6063fee1..ff1cc83c 100644 --- a/algorithms/two_pointers/find_sum_of_three/test_find_sum_of_three.py +++ b/algorithms/two_pointers/find_sum_of_three/test_find_sum_of_three.py @@ -12,32 +12,32 @@ def test_1(self): def test2(self): """should return True for nums=[3,7,1,2,8,4,5], target=10""" - nums = [3,7,1,2,8,4,5] + nums = [3, 7, 1, 2, 8, 4, 5] target = 10 actual = find_sum_of_three(nums, target) self.assertTrue(actual) def test_3(self): """should return False for nums=[3,7,1,2,8,4,5], target=21""" - nums = [3,7,1,2,8,4,5] + nums = [3, 7, 1, 2, 8, 4, 5] target = 21 actual = find_sum_of_three(nums, target) self.assertFalse(actual) def test_4(self): """should return True for nums=[-1,2,1,-4,5,-3], target=-8""" - nums = [-1,2,1,-4,5,-3] + nums = [-1, 2, 1, -4, 5, -3] target = -8 actual = find_sum_of_three(nums, target) self.assertTrue(actual) def test_5(self): """should return True for nums=[-1,2,1,-4,5,-3], target=0""" - nums = [-1,2,1,-4,5,-3] + nums = [-1, 2, 1, -4, 5, -3] target = 0 actual = find_sum_of_three(nums, target) self.assertTrue(actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/algorithms/two_pointers/pair_with_sum_in_array/test_pair_with_sum_in_array.py b/algorithms/two_pointers/pair_with_sum_in_array/test_pair_with_sum_in_array.py index 61ed7d1b..187c3cea 100644 --- a/algorithms/two_pointers/pair_with_sum_in_array/test_pair_with_sum_in_array.py +++ b/algorithms/two_pointers/pair_with_sum_in_array/test_pair_with_sum_in_array.py @@ -20,5 +20,5 @@ def test_2(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/algorithms/two_pointers/reverse_array/test_reverse_array.py b/algorithms/two_pointers/reverse_array/test_reverse_array.py index 0769e1db..052517f4 100644 --- a/algorithms/two_pointers/reverse_array/test_reverse_array.py +++ b/algorithms/two_pointers/reverse_array/test_reverse_array.py @@ -6,10 +6,10 @@ class ReverseArrayInPlaceTestCase(unittest.TestCase): def test_1(self): """should reverse an array of [1,2,3,4,5,6] in place""" collection = [1, 2, 3, 4, 5, 6] - expected = [6,5,4,3,2,1] + expected = [6, 5, 4, 3, 2, 1] reverse_array_in_place(collection) self.assertEqual(collection, expected) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/algorithms/two_pointers/sort_colors/__init__.py b/algorithms/two_pointers/sort_colors/__init__.py index 1e012c7d..ddc101ac 100644 --- a/algorithms/two_pointers/sort_colors/__init__.py +++ b/algorithms/two_pointers/sort_colors/__init__.py @@ -37,6 +37,7 @@ def sort_colors(colors: List[int]) -> List[int]: return colors + def sort_colors_v2(colors: List[int]) -> List[int]: """ Sorts a list of 0s, 1s, and 2s in place using two pointers diff --git a/algorithms/two_pointers/sort_colors/test_sort_colors.py b/algorithms/two_pointers/sort_colors/test_sort_colors.py index 41edc2a0..ff008baa 100644 --- a/algorithms/two_pointers/sort_colors/test_sort_colors.py +++ b/algorithms/two_pointers/sort_colors/test_sort_colors.py @@ -3,7 +3,6 @@ class SortColorsV2TestCase(unittest.TestCase): - def test_1(self): """should sort colors = [1,0,2,1,2,2] to [0,1,1,2,2,2]""" colors = [1, 0, 2, 1, 2, 2] @@ -13,8 +12,8 @@ def test_1(self): def test_2(self): """should sort colors = [0,1,1,2,0,2,0,2,1,2] to [0,0,0,1,1,1,2,2,2,2]""" - colors = [0,1,1,2,0,2,0,2,1,2] - expected = [0,0,0,1,1,1,2,2,2,2] + colors = [0, 1, 1, 2, 0, 2, 0, 2, 1, 2] + expected = [0, 0, 0, 1, 1, 1, 2, 2, 2, 2] actual = sort_colors_v2(colors) self.assertEqual(expected, actual) @@ -27,8 +26,8 @@ def test_3(self): def test_4(self): """should sort colors = [0,1,0] to [0,0,1]""" - colors = [0,1,0] - expected = [0,0,1] + colors = [0, 1, 0] + expected = [0, 0, 1] actual = sort_colors_v2(colors) self.assertEqual(expected, actual) @@ -41,28 +40,27 @@ def test_5(self): def test_6(self): """should sort colors = [2,2] to [2,2]""" - colors = [2,2] - expected = [2,2] + colors = [2, 2] + expected = [2, 2] actual = sort_colors_v2(colors) self.assertEqual(expected, actual) def test_7(self): """should sort colors = [1,1,0,2] to [0,1,1,2]""" - colors = [1,1,0,2] - expected = [0,1,1,2] + colors = [1, 1, 0, 2] + expected = [0, 1, 1, 2] actual = sort_colors_v2(colors) self.assertEqual(expected, actual) def test_8(self): """should sort colors = [2,1,1,0,0] to [0,0,1,1,2]""" - colors = [2,1,1,0,0] - expected = [0,0,1,1,2] + colors = [2, 1, 1, 0, 0] + expected = [0, 0, 1, 1, 2] actual = sort_colors_v2(colors) self.assertEqual(expected, actual) class SortColorsTestCase(unittest.TestCase): - def test_1(self): """should sort colors = [1,0,2,1,2,2] to [0,1,1,2,2,2]""" colors = [1, 0, 2, 1, 2, 2] @@ -72,8 +70,8 @@ def test_1(self): def test_2(self): """should sort colors = [0,1,1,2,0,2,0,2,1,2] to [0,0,0,1,1,1,2,2,2,2]""" - colors = [0,1,1,2,0,2,0,2,1,2] - expected = [0,0,0,1,1,1,2,2,2,2] + colors = [0, 1, 1, 2, 0, 2, 0, 2, 1, 2] + expected = [0, 0, 0, 1, 1, 1, 2, 2, 2, 2] actual = sort_colors(colors) self.assertEqual(expected, actual) @@ -86,8 +84,8 @@ def test_3(self): def test_4(self): """should sort colors = [0,1,0] to [0,0,1]""" - colors = [0,1,0] - expected = [0,0,1] + colors = [0, 1, 0] + expected = [0, 0, 1] actual = sort_colors(colors) self.assertEqual(expected, actual) @@ -100,24 +98,25 @@ def test_5(self): def test_6(self): """should sort colors = [2,2] to [2,2]""" - colors = [2,2] - expected = [2,2] + colors = [2, 2] + expected = [2, 2] actual = sort_colors(colors) self.assertEqual(expected, actual) def test_7(self): """should sort colors = [1,1,0,2] to [0,1,1,2]""" - colors = [1,1,0,2] - expected = [0,1,1,2] + colors = [1, 1, 0, 2] + expected = [0, 1, 1, 2] actual = sort_colors(colors) self.assertEqual(expected, actual) def test_8(self): """should sort colors = [2,1,1,0,0] to [0,0,1,1,2]""" - colors = [2,1,1,0,0] - expected = [0,0,1,1,2] + colors = [2, 1, 1, 0, 0] + expected = [0, 0, 1, 1, 2] actual = sort_colors(colors) self.assertEqual(expected, actual) -if __name__ == '__main__': + +if __name__ == "__main__": unittest.main() diff --git a/datastructures/arrays/arbitrary_precision_increment/test_arbitrary_precision_increment.py b/datastructures/arrays/arbitrary_precision_increment/test_arbitrary_precision_increment.py index ff66a93d..9a08b5ad 100644 --- a/datastructures/arrays/arbitrary_precision_increment/test_arbitrary_precision_increment.py +++ b/datastructures/arrays/arbitrary_precision_increment/test_arbitrary_precision_increment.py @@ -37,5 +37,5 @@ def test_2_2(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/datastructures/arrays/array_advance_game/test_array_advance_game.py b/datastructures/arrays/array_advance_game/test_array_advance_game.py index 0933dd93..0de430ea 100644 --- a/datastructures/arrays/array_advance_game/test_array_advance_game.py +++ b/datastructures/arrays/array_advance_game/test_array_advance_game.py @@ -22,5 +22,5 @@ def test_3(self): self.assertTrue(actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/datastructures/arrays/matrix/settozero/__init__.py b/datastructures/arrays/matrix/settozero/__init__.py index 9a108808..1b8721f5 100644 --- a/datastructures/arrays/matrix/settozero/__init__.py +++ b/datastructures/arrays/matrix/settozero/__init__.py @@ -33,8 +33,8 @@ def set_matrix_zeros(mat: List[List[int]]) -> List[List[int]]: if mat[r][c] == 0: # Mark this row and column by setting the corresponding # positions in the first row and column to zero - mat[r][0] = 0 # mark row as 0 - mat[0][c] = 0 # mark column as 0 + mat[r][0] = 0 # mark row as 0 + mat[0][c] = 0 # mark column as 0 # Step 3: Use the markers to set zeros in the interior of the matrix # We process from [1][1] onwards to avoid corrupting our markers diff --git a/datastructures/arrays/matrix/settozero/test_set_matrix_zero.py b/datastructures/arrays/matrix/settozero/test_set_matrix_zero.py index cfe6ea80..0e5d4374 100644 --- a/datastructures/arrays/matrix/settozero/test_set_matrix_zero.py +++ b/datastructures/arrays/matrix/settozero/test_set_matrix_zero.py @@ -4,35 +4,47 @@ class SetMatrixZeroTestCase(unittest.TestCase): def test_1(self): - matrix = [[1,2,3],[4,5,6],[7,0,9]] - expected = [[1,0,3],[4,0,6],[0,0,0]] + matrix = [[1, 2, 3], [4, 5, 6], [7, 0, 9]] + expected = [[1, 0, 3], [4, 0, 6], [0, 0, 0]] actual = set_matrix_zeros(matrix) self.assertEqual(expected, actual) def test_2(self): - matrix = [[1,2,3,4],[4,5,6,7],[8,9,4,6]] - expected = [[1,2,3,4],[4,5,6,7],[8,9,4,6]] + matrix = [[1, 2, 3, 4], [4, 5, 6, 7], [8, 9, 4, 6]] + expected = [[1, 2, 3, 4], [4, 5, 6, 7], [8, 9, 4, 6]] actual = set_matrix_zeros(matrix) self.assertEqual(expected, actual) def test_3(self): - matrix = [[1,1,0,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,0,1,1,1],[1,1,1,1,1]] - expected = [[0, 0, 0, 0, 0], [1, 0, 0, 1, 1], [1, 0, 0, 1, 1], [0, 0, 0, 0, 0], [1, 0, 0, 1, 1]] + matrix = [ + [1, 1, 0, 1, 1], + [1, 1, 1, 1, 1], + [1, 1, 1, 1, 1], + [1, 0, 1, 1, 1], + [1, 1, 1, 1, 1], + ] + expected = [ + [0, 0, 0, 0, 0], + [1, 0, 0, 1, 1], + [1, 0, 0, 1, 1], + [0, 0, 0, 0, 0], + [1, 0, 0, 1, 1], + ] actual = set_matrix_zeros(matrix) self.assertEqual(expected, actual) def test_4(self): - matrix = [[1,1,1],[1,0,1],[1,1,1]] + matrix = [[1, 1, 1], [1, 0, 1], [1, 1, 1]] expected = [[1, 0, 1], [0, 0, 0], [1, 0, 1]] actual = set_matrix_zeros(matrix) self.assertEqual(expected, actual) def test_5(self): - matrix = [[3,5,2,0],[1,0,4,6],[7,3,2,4]] + matrix = [[3, 5, 2, 0], [1, 0, 4, 6], [7, 3, 2, 4]] expected = [[0, 0, 0, 0], [0, 0, 0, 0], [7, 0, 2, 0]] actual = set_matrix_zeros(matrix) self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/datastructures/arrays/subarrays_with_fixed_bounds/test_subarrays_with_fixed_bounds.py b/datastructures/arrays/subarrays_with_fixed_bounds/test_subarrays_with_fixed_bounds.py index 73e1f7cd..aefcb380 100644 --- a/datastructures/arrays/subarrays_with_fixed_bounds/test_subarrays_with_fixed_bounds.py +++ b/datastructures/arrays/subarrays_with_fixed_bounds/test_subarrays_with_fixed_bounds.py @@ -4,7 +4,7 @@ class SubarraysWithFixedBoundsTestCase(unittest.TestCase): def test_1(self): - nums = [2,1,4,3,2] + nums = [2, 1, 4, 3, 2] min_k = 2 max_k = 3 expected = 1 @@ -12,7 +12,7 @@ def test_1(self): self.assertEqual(expected, actual) def test_2(self): - nums = [1,2,3,2,1] + nums = [1, 2, 3, 2, 1] min_k = 1 max_k = 3 expected = 5 @@ -20,7 +20,7 @@ def test_2(self): self.assertEqual(expected, actual) def test_3(self): - nums = [4,4,4] + nums = [4, 4, 4] min_k = 4 max_k = 4 expected = 6 @@ -28,7 +28,7 @@ def test_3(self): self.assertEqual(expected, actual) def test_4(self): - nums = [2,2,2] + nums = [2, 2, 2] min_k = 4 max_k = 4 expected = 0 @@ -36,7 +36,7 @@ def test_4(self): self.assertEqual(expected, actual) def test_5(self): - nums = [1,3,5,2,7,5] + nums = [1, 3, 5, 2, 7, 5] min_k = 1 max_k = 5 expected = 2 @@ -44,7 +44,7 @@ def test_5(self): self.assertEqual(expected, actual) def test_6(self): - nums = [3,3,3] + nums = [3, 3, 3] min_k = 3 max_k = 3 expected = 6 @@ -52,5 +52,5 @@ def test_6(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/datastructures/linked_lists/__init__.py b/datastructures/linked_lists/__init__.py index 8ad1b28b..1262c6bc 100755 --- a/datastructures/linked_lists/__init__.py +++ b/datastructures/linked_lists/__init__.py @@ -13,7 +13,12 @@ class Node(Generic[T]): __metaclass__ = ABCMeta - def __init__(self, data: Optional[T] = None, next_: Optional['Node[Generic[T]]'] = None, key: Any = None): + def __init__( + self, + data: Optional[T] = None, + next_: Optional["Node[Generic[T]]"] = None, + key: Any = None, + ): self.data = data self.next = next_ # if no key is provided, the hash of the data becomes the key diff --git a/datastructures/linked_lists/circular/__init__.py b/datastructures/linked_lists/circular/__init__.py index 7d239c34..980cc9f8 100644 --- a/datastructures/linked_lists/circular/__init__.py +++ b/datastructures/linked_lists/circular/__init__.py @@ -5,7 +5,6 @@ class CircularLinkedList(LinkedList): - def __init__(self, head: Optional[CircularNode] = None): super().__init__(head) diff --git a/datastructures/linked_lists/circular/node.py b/datastructures/linked_lists/circular/node.py index d8f39ead..685cfce2 100644 --- a/datastructures/linked_lists/circular/node.py +++ b/datastructures/linked_lists/circular/node.py @@ -7,5 +7,7 @@ class CircularNode(Node): CircularNode implementation in a circular linked list """ - def __init__(self, value: T, next_: Optional[Self] = None, key: Optional[Any] = None): + def __init__( + self, value: T, next_: Optional[Self] = None, key: Optional[Any] = None + ): super().__init__(value, next_, key) diff --git a/datastructures/linked_lists/circular/test_circular_linked_list.py b/datastructures/linked_lists/circular/test_circular_linked_list.py index a4debea4..93801fad 100644 --- a/datastructures/linked_lists/circular/test_circular_linked_list.py +++ b/datastructures/linked_lists/circular/test_circular_linked_list.py @@ -71,5 +71,5 @@ def test_1(self): self.assertEqual(expected[1], list(second_list)) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/datastructures/linked_lists/doubly_linked_list/__init__.py b/datastructures/linked_lists/doubly_linked_list/__init__.py index b67381bd..b28737e5 100755 --- a/datastructures/linked_lists/doubly_linked_list/__init__.py +++ b/datastructures/linked_lists/doubly_linked_list/__init__.py @@ -682,7 +682,6 @@ def pairs_with_sum(self, target: T) -> List[Tuple[DoubleNode, DoubleNode]]: nxt = current.next while nxt: - if current.data + nxt.data == target: pairs.append((current, nxt)) diff --git a/datastructures/linked_lists/doubly_linked_list/node.py b/datastructures/linked_lists/doubly_linked_list/node.py index c39662c4..a978adf5 100644 --- a/datastructures/linked_lists/doubly_linked_list/node.py +++ b/datastructures/linked_lists/doubly_linked_list/node.py @@ -9,11 +9,11 @@ class DoubleNode(Node): """ def __init__( - self, - data: Any, - previous: Optional["DoubleNode"] = None, - next_: Optional["DoubleNode"] = None, - key: Optional[Any] = None, + self, + data: Any, + previous: Optional["DoubleNode"] = None, + next_: Optional["DoubleNode"] = None, + key: Optional[Any] = None, ): super().__init__(data=data, next_=next_, key=key) self.previous = previous diff --git a/datastructures/linked_lists/mergeklinkedlists/__init__.py b/datastructures/linked_lists/mergeklinkedlists/__init__.py index cc3e3026..878df547 100644 --- a/datastructures/linked_lists/mergeklinkedlists/__init__.py +++ b/datastructures/linked_lists/mergeklinkedlists/__init__.py @@ -2,7 +2,9 @@ from .. import Node -def merge_two_sorted_lists(head_one: Optional[Node], head_two: Optional[Node]) -> Optional[Node]: +def merge_two_sorted_lists( + head_one: Optional[Node], head_two: Optional[Node] +) -> Optional[Node]: """ Merges two sorted linked list into 1 sorted linked list. Note that the assumption here is that the 2 linked lists are already sorted. If either of the heads of the linked list that is provided is None, the other head node is diff --git a/datastructures/linked_lists/mergeklinkedlists/test_merge.py b/datastructures/linked_lists/mergeklinkedlists/test_merge.py index 953cbe00..256835a7 100644 --- a/datastructures/linked_lists/mergeklinkedlists/test_merge.py +++ b/datastructures/linked_lists/mergeklinkedlists/test_merge.py @@ -45,7 +45,11 @@ def test_2_merge_3_linked_lists(self): for data in l3: linked_list_three.append(data) - linked_lists = [linked_list_one.head, linked_list_two.head, linked_list_three.head] + linked_lists = [ + linked_list_one.head, + linked_list_two.head, + linked_list_three.head, + ] actual = merge_k_lists(linked_lists) self.assertIsNotNone(actual) @@ -59,5 +63,5 @@ def test_2_merge_3_linked_lists(self): self.assertEqual(expected, actual_data) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/datastructures/linked_lists/singly_linked_list/__init__.py b/datastructures/linked_lists/singly_linked_list/__init__.py index 4094c7f6..a564ce79 100755 --- a/datastructures/linked_lists/singly_linked_list/__init__.py +++ b/datastructures/linked_lists/singly_linked_list/__init__.py @@ -134,7 +134,9 @@ def delete_node_at_position(self, position: int) -> Optional[SingleNode]: current = current.next if current is None: - raise ValueError(f"Invalid position {position} found, reached end of list") + raise ValueError( + f"Invalid position {position} found, reached end of list" + ) current.data = current.next.data if current.next else None current.next = current.next.next if current.next else None diff --git a/datastructures/linked_lists/singly_linked_list/test_singly_linked_list_remove_nth_last_node.py b/datastructures/linked_lists/singly_linked_list/test_singly_linked_list_remove_nth_last_node.py index eb63da52..f12df193 100644 --- a/datastructures/linked_lists/singly_linked_list/test_singly_linked_list_remove_nth_last_node.py +++ b/datastructures/linked_lists/singly_linked_list/test_singly_linked_list_remove_nth_last_node.py @@ -3,7 +3,6 @@ class RemoveNthLastNodeTestCases(unittest.TestCase): - def test_0(self): """should raise ValueError when the value of n is out of bounds""" linked_list = SinglyLinkedList() @@ -76,13 +75,13 @@ def test_4(self): def test_5(self): """should delete nth last node where n=6 and list is [69,8,49,106,116,112] to become [8,49,106,116,112]""" linked_list = SinglyLinkedList() - data = [69,8,49,106,116,112] + data = [69, 8, 49, 106, 116, 112] for d in data: linked_list.append(d) n = 6 new_head = linked_list.delete_nth_last_node(n) - expected = [8,49,106,116,112] + expected = [8, 49, 106, 116, 112] self.assertIsNotNone(new_head) self.assertEqual(new_head.data, 8) @@ -106,13 +105,13 @@ def test_6(self): def test_7(self): """should delete nth last node where n=4 and list is [288,224,275,390,4,383,330,60,193] to become [288,224,275,390,4,330,60,193]""" linked_list = SinglyLinkedList() - data = [288,224,275,390,4,383,330,60,193] + data = [288, 224, 275, 390, 4, 383, 330, 60, 193] for d in data: linked_list.append(d) n = 4 new_head = linked_list.delete_nth_last_node(n) - expected = [288,224,275,390,4,330,60,193] + expected = [288, 224, 275, 390, 4, 330, 60, 193] self.assertIsNotNone(new_head) self.assertEqual(new_head.data, 288) @@ -121,13 +120,13 @@ def test_7(self): def test_8(self): """should delete nth last node where n=3 and list is [34,53,6,95,38,28,17,63,16,76] to become [34,53,6,95,38,28,17,16,76]""" linked_list = SinglyLinkedList() - data = [34,53,6,95,38,28,17,63,16,76] + data = [34, 53, 6, 95, 38, 28, 17, 63, 16, 76] for d in data: linked_list.append(d) n = 3 new_head = linked_list.delete_nth_last_node(n) - expected = [34,53,6,95,38,28,17,16,76] + expected = [34, 53, 6, 95, 38, 28, 17, 16, 76] self.assertIsNotNone(new_head) self.assertEqual(new_head.data, 34) @@ -136,18 +135,18 @@ def test_8(self): def test_9(self): """should delete nth last node where n=2 and list is [23,28,10,5,67,39,70,28] to become [23,28,10,5,67,39,28]""" linked_list = SinglyLinkedList() - data = [23,28,10,5,67,39,70,28] + data = [23, 28, 10, 5, 67, 39, 70, 28] for d in data: linked_list.append(d) n = 2 new_head = linked_list.delete_nth_last_node(n) - expected = [23,28,10,5,67,39,28] + expected = [23, 28, 10, 5, 67, 39, 28] self.assertIsNotNone(new_head) self.assertEqual(new_head.data, 23) self.assertEqual(expected, list(linked_list)) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/datastructures/linked_lists/singly_linked_list/test_singly_linked_palindrome.py b/datastructures/linked_lists/singly_linked_list/test_singly_linked_palindrome.py index 020d7ad5..63a3d44d 100644 --- a/datastructures/linked_lists/singly_linked_list/test_singly_linked_palindrome.py +++ b/datastructures/linked_lists/singly_linked_list/test_singly_linked_palindrome.py @@ -49,7 +49,7 @@ def test_4(self): def test_5(self): """should return true for [1,2,3,2,1]""" linked_list = SinglyLinkedList() - data = [1,2,3,2,1] + data = [1, 2, 3, 2, 1] for d in data: linked_list.append(d) @@ -59,7 +59,7 @@ def test_5(self): def test_6(self): """should return true for [4,7,9,5,4]""" linked_list = SinglyLinkedList() - data = [4,7,9,5,4] + data = [4, 7, 9, 5, 4] for d in data: linked_list.append(d) @@ -69,7 +69,7 @@ def test_6(self): def test_7(self): """should return true for [2,3,5,5,3,2]""" linked_list = SinglyLinkedList() - data = [2,3,5,5,3,2] + data = [2, 3, 5, 5, 3, 2] for d in data: linked_list.append(d) @@ -79,28 +79,29 @@ def test_7(self): def test_8(self): """should return true for [6,1,0,5,1,6]""" linked_list = SinglyLinkedList() - data = [6,1,0,5,1,6] + data = [6, 1, 0, 5, 1, 6] for d in data: linked_list.append(d) actual = linked_list.is_palindrome() self.assertFalse(actual) - def test_9(self): """should return true for [3,6,9,8,4,8,9,6,3]""" linked_list = SinglyLinkedList() - data = [3,6,9,8,4,8,9,6,3] + data = [3, 6, 9, 8, 4, 8, 9, 6, 3] for d in data: linked_list.append(d) actual = linked_list.is_palindrome() self.assertTrue(actual) + class LinkedListIsPalindromeV2TestCase(unittest.TestCase): """ Tests to check if a linked list is a palindrome using fast and slow pointers approach """ + @pytest.mark.linked_list_is_palindrome_fast_and_slow_pointer def test_1(self): """should return true for ["r", "a", "c", "e", "c", "a", "r"]""" @@ -149,7 +150,7 @@ def test_4(self): def test_5(self): """should return true for [1,2,3,2,1]""" linked_list = SinglyLinkedList() - data = [1,2,3,2,1] + data = [1, 2, 3, 2, 1] for d in data: linked_list.append(d) @@ -160,7 +161,7 @@ def test_5(self): def test_6(self): """should return true for [4,7,9,5,4]""" linked_list = SinglyLinkedList() - data = [4,7,9,5,4] + data = [4, 7, 9, 5, 4] for d in data: linked_list.append(d) @@ -171,7 +172,7 @@ def test_6(self): def test_7(self): """should return true for [2,3,5,5,3,2]""" linked_list = SinglyLinkedList() - data = [2,3,5,5,3,2] + data = [2, 3, 5, 5, 3, 2] for d in data: linked_list.append(d) @@ -182,7 +183,7 @@ def test_7(self): def test_8(self): """should return false for [6,1,0,5,1,6]""" linked_list = SinglyLinkedList() - data = [6,1,0,5,1,6] + data = [6, 1, 0, 5, 1, 6] for d in data: linked_list.append(d) @@ -193,7 +194,7 @@ def test_8(self): def test_9(self): """should return true for [3,6,9,8,4,8,9,6,3]""" linked_list = SinglyLinkedList() - data = [3,6,9,8,4,8,9,6,3] + data = [3, 6, 9, 8, 4, 8, 9, 6, 3] for d in data: linked_list.append(d) diff --git a/datastructures/trees/__init__.py b/datastructures/trees/__init__.py index 6f427d2b..8df8929a 100755 --- a/datastructures/trees/__init__.py +++ b/datastructures/trees/__init__.py @@ -33,7 +33,7 @@ def height(self) -> int: @abstractmethod def lowest_common_ancestor( - self, node_one: TreeNode, node_two: TreeNode + self, node_one: TreeNode, node_two: TreeNode ) -> TreeNode: """ Returns the lowest common ancestor of 2 nodes in the Tree. diff --git a/datastructures/trees/binary/node.py b/datastructures/trees/binary/node.py index f659e9cb..6d869246 100644 --- a/datastructures/trees/binary/node.py +++ b/datastructures/trees/binary/node.py @@ -9,11 +9,11 @@ class BinaryTreeNode(TreeNode): """ def __init__( - self, - data: T, - left: Optional["BinaryTreeNode"] = None, - right: Optional["BinaryTreeNode"] = None, - key: Optional[Any] = None + self, + data: T, + left: Optional["BinaryTreeNode"] = None, + right: Optional["BinaryTreeNode"] = None, + key: Optional[Any] = None, ): super().__init__(data, key) self.left: Optional[BinaryTreeNode] = left diff --git a/datastructures/trees/binary/search_tree/__init__.py b/datastructures/trees/binary/search_tree/__init__.py index 8108f0e8..da6e03ca 100755 --- a/datastructures/trees/binary/search_tree/__init__.py +++ b/datastructures/trees/binary/search_tree/__init__.py @@ -54,7 +54,7 @@ def delete_node(self, key: T) -> Optional[BinaryTreeNode]: return self.root def delete_helper( - value: T, node: Optional[BinaryTreeNode] + value: T, node: Optional[BinaryTreeNode] ) -> Optional[BinaryTreeNode]: # base case when we have hit the bottom of the tree, and the parent node has no children if node is None: @@ -88,7 +88,7 @@ def delete_helper( return node def lift( - node: BinaryTreeNode, node_to_delete: BinaryTreeNode + node: BinaryTreeNode, node_to_delete: BinaryTreeNode ) -> BinaryTreeNode: # if the current node of this function has a left child, we recursively call this function to continue down # the left subtree to find the successor node @@ -530,7 +530,7 @@ def is_binary_search_tree(self): return True def is_binary_search_tree_recursive( - self, root: BinaryTreeNode, lower_bound=-float("inf"), upper_bound=float("inf") + self, root: BinaryTreeNode, lower_bound=-float("inf"), upper_bound=float("inf") ): """ This uses the call stack to check if the binary search tree node is valid. @@ -551,10 +551,10 @@ def is_binary_search_tree_recursive( return False return not ( - not self.is_binary_search_tree_recursive(root.left, lower_bound, root.data) - or not self.is_binary_search_tree_recursive( - root.right, root.data, upper_bound - ) + not self.is_binary_search_tree_recursive(root.left, lower_bound, root.data) + or not self.is_binary_search_tree_recursive( + root.right, root.data, upper_bound + ) ) def search_node(self, data: T) -> bool: @@ -639,7 +639,7 @@ def is_balanced(self) -> bool: # 1) more than 2 different leaf depths # 2) 2 leaf depths that are more than 1 apart if len(depths) > 2 or ( - len(depths) == 2 and abs(depths[0] - depths[1]) > 1 + len(depths) == 2 and abs(depths[0] - depths[1]) > 1 ): return False @@ -653,7 +653,7 @@ def is_balanced(self) -> bool: return True def lowest_common_ancestor( - self, node_one: BinaryTreeNode, node_two: BinaryTreeNode + self, node_one: BinaryTreeNode, node_two: BinaryTreeNode ) -> BinaryTreeNode: """ Considering it is a BST, we can assume that this tree is a valid BST, we could also check for this diff --git a/datastructures/trees/binary/search_tree/test_binary_search_tree_insert.py b/datastructures/trees/binary/search_tree/test_binary_search_tree_insert.py index 0a322030..d1b2e8ee 100644 --- a/datastructures/trees/binary/search_tree/test_binary_search_tree_insert.py +++ b/datastructures/trees/binary/search_tree/test_binary_search_tree_insert.py @@ -15,9 +15,7 @@ def test_1(self): expected_root = BinaryTreeNode( data=8, left=BinaryTreeNode( - data=3, - left=BinaryTreeNode(data=1), - right=BinaryTreeNode(data=6) + data=3, left=BinaryTreeNode(data=1), right=BinaryTreeNode(data=6) ), right=BinaryTreeNode(data=10), ) @@ -26,7 +24,9 @@ def test_1(self): self.assertEqual(expected_root.left.data, search_tree.root.left.data) self.assertEqual(expected_root.right.data, search_tree.root.right.data) self.assertEqual(expected_root.left.left.data, search_tree.root.left.left.data) - self.assertEqual(expected_root.left.right.data, search_tree.root.left.right.data) + self.assertEqual( + expected_root.left.right.data, search_tree.root.left.right.data + ) if __name__ == "__main__": diff --git a/datastructures/trees/binary/tree/__init__.py b/datastructures/trees/binary/tree/__init__.py index bf7cbf1a..0cc61d6f 100644 --- a/datastructures/trees/binary/tree/__init__.py +++ b/datastructures/trees/binary/tree/__init__.py @@ -219,7 +219,7 @@ def flatten_into_linked_list(self) -> None: tree_node.left = None def lowest_common_ancestor( - self, node_one: BinaryTreeNode, node_two: BinaryTreeNode + self, node_one: BinaryTreeNode, node_two: BinaryTreeNode ) -> Optional[BinaryTreeNode]: """ The approach is pretty intuitive. Traverse the tree in a depth first manner. The moment you encounter either of @@ -263,10 +263,10 @@ def lowest_common_ancestor( return None def lca_util( - node: Optional[BinaryTreeNode], - node_one_value: T, - node_two_val: T, - node_lookup: List[bool], + node: Optional[BinaryTreeNode], + node_one_value: T, + node_two_val: T, + node_lookup: List[bool], ) -> Optional[BinaryTreeNode]: """Returns the Lowest Common Ancestor of 2 node values.This updates a node lookup list that has 2 values. The first index is for node_one_value and the second index is for node_two_value. They will be updated to @@ -309,9 +309,9 @@ def is_key_in_subtree(current_node: Optional[BinaryTreeNode], key: T) -> bool: # If key is present at root, or if left subtree or right subtree , return true if ( - current_node.data == key - or is_key_in_subtree(current_node.left, key) - or is_key_in_subtree(current_node.right, key) + current_node.data == key + or is_key_in_subtree(current_node.left, key) + or is_key_in_subtree(current_node.right, key) ): return True @@ -321,12 +321,12 @@ def is_key_in_subtree(current_node: Optional[BinaryTreeNode], key: T) -> bool: lca = lca_util(self.root, node_one.data, node_two.data, lookup) if ( - lookup[0] - and lookup[1] - or lookup[0] - and is_key_in_subtree(lca, node_two.data) - or lookup[1] - and is_key_in_subtree(lca, node_one.data) + lookup[0] + and lookup[1] + or lookup[0] + and is_key_in_subtree(lca, node_two.data) + or lookup[1] + and is_key_in_subtree(lca, node_one.data) ): return lca @@ -461,7 +461,7 @@ def is_height_balanced(node: BinaryTreeNode) -> bool: def leaf_similar(self, other: "BinaryTree") -> bool: if (self.root is None and other.root is not None) or ( - other.root is None and self.root is not None + other.root is None and self.root is not None ): return False @@ -503,7 +503,7 @@ def path_sum(self, target: T) -> int: return 0 def count_paths( - sum_hash: Dict[int, int], prefix_sum: T, node: BinaryTreeNode + sum_hash: Dict[int, int], prefix_sum: T, node: BinaryTreeNode ) -> int: if node is None: return 0 @@ -559,10 +559,10 @@ def paths_to_target(self, target: T) -> List[T]: return paths def dfs( - node: Optional[BinaryTreeNode], - path: List[T], - result: List, - remaining_sum: T, + node: Optional[BinaryTreeNode], + path: List[T], + result: List, + remaining_sum: T, ): """Traverses the tree from root to leaf paths in a depth first search manner. diff --git a/datastructures/trees/binary/tree/test_binary_tree.py b/datastructures/trees/binary/tree/test_binary_tree.py index d1880a6e..f4550e19 100644 --- a/datastructures/trees/binary/tree/test_binary_tree.py +++ b/datastructures/trees/binary/tree/test_binary_tree.py @@ -220,7 +220,9 @@ def test_returns_1_for_root_but_no_children(self): def test_returns_3_for_tree_3_9_20_null_null_15_7(self): """should return 3 if the binary tree [3,9,20,null,null,15,7]""" left = BinaryTreeNode(data=9) - right = BinaryTreeNode(data=20, left=BinaryTreeNode(data=15), right=BinaryTreeNode(data=7)) + right = BinaryTreeNode( + data=20, left=BinaryTreeNode(data=15), right=BinaryTreeNode(data=7) + ) root = BinaryTreeNode(data=3, left=left, right=right) tree = BinaryTree(root=root) @@ -243,7 +245,9 @@ def test_returns_2_for_tree_1_null_20(self): def test_returns_2_for_tree_1_2_3_4_5(self): """should return 2 if the binary tree [1,2,3,4,5]""" right = BinaryTreeNode(data=3) - left = BinaryTreeNode(data=2, left=BinaryTreeNode(data=4), right=BinaryTreeNode(5)) + left = BinaryTreeNode( + data=2, left=BinaryTreeNode(data=4), right=BinaryTreeNode(5) + ) root = BinaryTreeNode(data=1, left=left, right=right) tree = BinaryTree(root=root) @@ -272,7 +276,9 @@ def test_returns_1_for_root_but_no_children(self): def test_returns_5_for_tree_3_9_20_null_null_15_7(self): """should return 5 if the binary tree [3,9,20,null,null,15,7]""" left = BinaryTreeNode(data=9) - right = BinaryTreeNode(data=20, left=BinaryTreeNode(data=15), right=BinaryTreeNode(data=7)) + right = BinaryTreeNode( + data=20, left=BinaryTreeNode(data=15), right=BinaryTreeNode(data=7) + ) root = BinaryTreeNode(data=3, left=left, right=right) tree = BinaryTree(root=root) @@ -295,7 +301,9 @@ def test_returns_2_for_tree_1_null_20(self): def test_returns_5_for_tree_1_2_3_4_5(self): """should return 5 if the binary tree [1,2,3,4,5]""" right = BinaryTreeNode(data=3) - left = BinaryTreeNode(data=2, left=BinaryTreeNode(data=4), right=BinaryTreeNode(5)) + left = BinaryTreeNode( + data=2, left=BinaryTreeNode(data=4), right=BinaryTreeNode(5) + ) root = BinaryTreeNode(data=1, left=left, right=right) tree = BinaryTree(root=root) @@ -706,8 +714,13 @@ def test_1(self): """Should return [F,B,A,D,C,E,G,I,H]""" expected = ["F", "B", "A", "D", "C", "E", "G", "I", "H"] right = BinaryTreeNode("G", right=BinaryTreeNode("I", left=BinaryTreeNode("H"))) - left = BinaryTreeNode("B", left=BinaryTreeNode("A"), - right=BinaryTreeNode("D", left=BinaryTreeNode("C"), right=BinaryTreeNode("E"))) + left = BinaryTreeNode( + "B", + left=BinaryTreeNode("A"), + right=BinaryTreeNode( + "D", left=BinaryTreeNode("C"), right=BinaryTreeNode("E") + ), + ) root = BinaryTreeNode("F", left=left, right=right) tree = BinaryTree(root=root) @@ -720,8 +733,13 @@ def test_1(self): """Should return [A, B, C, D, E, F, G, H, I]""" expected = ["A", "B", "C", "D", "E", "F", "G", "H", "I"] right = BinaryTreeNode("G", right=BinaryTreeNode("I", left=BinaryTreeNode("H"))) - left = BinaryTreeNode("B", left=BinaryTreeNode("A"), - right=BinaryTreeNode("D", left=BinaryTreeNode("C"), right=BinaryTreeNode("E"))) + left = BinaryTreeNode( + "B", + left=BinaryTreeNode("A"), + right=BinaryTreeNode( + "D", left=BinaryTreeNode("C"), right=BinaryTreeNode("E") + ), + ) root = BinaryTreeNode("F", left=left, right=right) tree = BinaryTree(root=root) @@ -734,8 +752,13 @@ def test_1(self): """Should return [A, C, E, D, B, H, I, G, F]""" expected = ["A", "C", "E", "D", "B", "H", "I", "G", "F"] right = BinaryTreeNode("G", right=BinaryTreeNode("I", left=BinaryTreeNode("H"))) - left = BinaryTreeNode("B", left=BinaryTreeNode("A"), - right=BinaryTreeNode("D", left=BinaryTreeNode("C"), right=BinaryTreeNode("E"))) + left = BinaryTreeNode( + "B", + left=BinaryTreeNode("A"), + right=BinaryTreeNode( + "D", left=BinaryTreeNode("C"), right=BinaryTreeNode("E") + ), + ) root = BinaryTreeNode("F", left=left, right=right) tree = BinaryTree(root=root) @@ -748,8 +771,7 @@ def test_1(self): """Should return [1, 2, 3, 4, 5]""" expected = [1, 2, 3, 4, 5] right = BinaryTreeNode(3) - left = BinaryTreeNode(2, left=BinaryTreeNode(4), - right=BinaryTreeNode(5)) + left = BinaryTreeNode(2, left=BinaryTreeNode(4), right=BinaryTreeNode(5)) root = BinaryTreeNode(1, left=left, right=right) tree = BinaryTree(root=root) @@ -762,8 +784,7 @@ def test_1(self): """Should return [4, 5, 2, 3, 1]""" expected = [4, 5, 2, 3, 1] right = BinaryTreeNode(3) - left = BinaryTreeNode(2, left=BinaryTreeNode(4), - right=BinaryTreeNode(5)) + left = BinaryTreeNode(2, left=BinaryTreeNode(4), right=BinaryTreeNode(5)) root = BinaryTreeNode(1, left=left, right=right) tree = BinaryTree(root=root) diff --git a/puzzles/arrays/tournament_winner/test_tournament_winner.py b/puzzles/arrays/tournament_winner/test_tournament_winner.py index 632eaf0d..8afae182 100644 --- a/puzzles/arrays/tournament_winner/test_tournament_winner.py +++ b/puzzles/arrays/tournament_winner/test_tournament_winner.py @@ -1,6 +1,7 @@ import unittest from . import tournament_winner + class TournamentWinnerTestCase(unittest.TestCase): def test_1(self): competitions = [["HTML", "C#"], ["C#", "Python"], ["Python", "HTML"]] @@ -10,12 +11,12 @@ def test_1(self): self.assertEqual(expected, actual) def test_2(self): - competitions = [["HTML", "Java"],["Java", "Python"],["Python", "HTML"]] + competitions = [["HTML", "Java"], ["Java", "Python"], ["Python", "HTML"]] results = [0, 1, 1] expected = "Java" actual = tournament_winner(competitions, results) self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/puzzles/permutations_check/__init__.py b/puzzles/permutations_check/__init__.py index 4c06dbb0..5ebbfc43 100644 --- a/puzzles/permutations_check/__init__.py +++ b/puzzles/permutations_check/__init__.py @@ -6,11 +6,10 @@ def check(n: int, m: int, games: List[List[int]]) -> bool: for game_round in games: for i, j in pairs: - - if i in game_round[:n // 2] and j in game_round[:n // 2]: + if i in game_round[: n // 2] and j in game_round[: n // 2]: return False - if i in game_round[n // 2:] and j in game_round[n // 2:]: + if i in game_round[n // 2 :] and j in game_round[n // 2 :]: return False return True diff --git a/puzzles/permutations_check/test_check.py b/puzzles/permutations_check/test_check.py index 6d096343..1f722dc6 100644 --- a/puzzles/permutations_check/test_check.py +++ b/puzzles/permutations_check/test_check.py @@ -30,24 +30,36 @@ def test_3(self): def test_4(self): """should return False for n = 6, m = 6, games=[[1, 6, 4, 5, 2], [6, 4, 2, 3, 1, 5], [4, 2, 1, 5, 6, 3], [4, 5, 1, 6, 2, 3], [3, 2, 5, 1, 6, 4], - [2, 3, 6, 4, 1, 5]]""" + [2, 3, 6, 4, 1, 5]]""" n = 6 m = 6 - games = [[1, 6, 4, 5, 2], [6, 4, 2, 3, 1, 5], [4, 2, 1, 5, 6, 3], [4, 5, 1, 6, 2, 3], [3, 2, 5, 1, 6, 4], - [2, 3, 6, 4, 1, 5]] + games = [ + [1, 6, 4, 5, 2], + [6, 4, 2, 3, 1, 5], + [4, 2, 1, 5, 6, 3], + [4, 5, 1, 6, 2, 3], + [3, 2, 5, 1, 6, 4], + [2, 3, 6, 4, 1, 5], + ] actual = check(n, m, games) self.assertTrue(actual) def test_5(self): """should return False for n = 6, m = 6, games=[[3, 1, 4, 5, 6, 2], [5, 3, 2, 4, 1, 6], [5, 3, 6, 4, 2, 1], [6, 5, 3, 2, 1, 4], [5, 4, 1, 2, 6, 3], - [4, 1, 6, 2, 5, 3]]""" + [4, 1, 6, 2, 5, 3]]""" n = 6 m = 6 - games = [[3, 1, 4, 5, 6, 2], [5, 3, 2, 4, 1, 6], [5, 3, 6, 4, 2, 1], [6, 5, 3, 2, 1, 4], [5, 4, 1, 2, 6, 3], - [4, 1, 6, 2, 5, 3]] + games = [ + [3, 1, 4, 5, 6, 2], + [5, 3, 2, 4, 1, 6], + [5, 3, 6, 4, 2, 1], + [6, 5, 3, 2, 1, 4], + [5, 4, 1, 2, 6, 3], + [4, 1, 6, 2, 5, 3], + ] actual = check(n, m, games) self.assertFalse(actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/puzzles/product_of_two_positive_integers/__init__.py b/puzzles/product_of_two_positive_integers/__init__.py index 7233e703..fda0d2c6 100644 --- a/puzzles/product_of_two_positive_integers/__init__.py +++ b/puzzles/product_of_two_positive_integers/__init__.py @@ -11,4 +11,4 @@ def recursive_multiply(x: int, y: int) -> int: return recursive_multiply(y, x) if y == 0: return 0 - return x + recursive_multiply(x, y - 1) \ No newline at end of file + return x + recursive_multiply(x, y - 1) diff --git a/puzzles/product_of_two_positive_integers/test_recursive_multiply.py b/puzzles/product_of_two_positive_integers/test_recursive_multiply.py index cc064fef..0066a0fd 100644 --- a/puzzles/product_of_two_positive_integers/test_recursive_multiply.py +++ b/puzzles/product_of_two_positive_integers/test_recursive_multiply.py @@ -7,7 +7,7 @@ def test_1(self): """should return 15 from 5 and 3""" x = 5 y = 3 - expected = x*y + expected = x * y actual = recursive_multiply(x, y) self.assertEqual(expected, actual) @@ -15,9 +15,10 @@ def test_2(self): """should return 1000000 from 500 and 2000""" x = 500 y = 2000 - expected = x*y + expected = x * y actual = recursive_multiply(x, y) self.assertEqual(expected, actual) -if __name__ == '__main__': + +if __name__ == "__main__": unittest.main() diff --git a/puzzles/search/binary_search/cyclically_shifted_array/__init__.py b/puzzles/search/binary_search/cyclically_shifted_array/__init__.py index b194333a..809f2334 100644 --- a/puzzles/search/binary_search/cyclically_shifted_array/__init__.py +++ b/puzzles/search/binary_search/cyclically_shifted_array/__init__.py @@ -1,5 +1,6 @@ from typing import List + def find_index_of_smallest_number(numbers: List[int]) -> int: """ Finds the index of the smallest number in a cyclically shifted array diff --git a/puzzles/search/binary_search/cyclically_shifted_array/test_cyclically_shifted_array.py b/puzzles/search/binary_search/cyclically_shifted_array/test_cyclically_shifted_array.py index bdf5417b..201f2e23 100644 --- a/puzzles/search/binary_search/cyclically_shifted_array/test_cyclically_shifted_array.py +++ b/puzzles/search/binary_search/cyclically_shifted_array/test_cyclically_shifted_array.py @@ -52,5 +52,6 @@ def test_7(self): actual = find_index_of_smallest_number(numbers) self.assertEqual(expected, actual) -if __name__ == '__main__': + +if __name__ == "__main__": unittest.main() diff --git a/puzzles/search/binary_search/find_closest_number/test_find_closest_number.py b/puzzles/search/binary_search/find_closest_number/test_find_closest_number.py index 5786a172..c065a18b 100644 --- a/puzzles/search/binary_search/find_closest_number/test_find_closest_number.py +++ b/puzzles/search/binary_search/find_closest_number/test_find_closest_number.py @@ -22,5 +22,5 @@ def test_2(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/puzzles/search/binary_search/find_closest_value/test_find_closest_value.py b/puzzles/search/binary_search/find_closest_value/test_find_closest_value.py index bc01c3cf..5c8b4e29 100644 --- a/puzzles/search/binary_search/find_closest_value/test_find_closest_value.py +++ b/puzzles/search/binary_search/find_closest_value/test_find_closest_value.py @@ -7,25 +7,24 @@ class FindClosestValueTestCases(unittest.TestCase): def test_something(self): root = BinaryTreeNode( data=10, - left=BinaryTreeNode(data=5, - left=BinaryTreeNode( - data=2, - left=BinaryTreeNode(data=1), - right=BinaryTreeNode(data=5)) - ), - right=BinaryTreeNode(data=15, - left=BinaryTreeNode( - data=13, - right=BinaryTreeNode( - data=14, - right=BinaryTreeNode(data=22) - ) - )) + left=BinaryTreeNode( + data=5, + left=BinaryTreeNode( + data=2, left=BinaryTreeNode(data=1), right=BinaryTreeNode(data=5) + ), + ), + right=BinaryTreeNode( + data=15, + left=BinaryTreeNode( + data=13, + right=BinaryTreeNode(data=14, right=BinaryTreeNode(data=22)), + ), + ), ) expected = 13 actual = find_closest_value_in_bst(root, target=12) self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/puzzles/search/binary_search/find_first_in_duplicate_list/__init__.py b/puzzles/search/binary_search/find_first_in_duplicate_list/__init__.py index 360aae16..d5eba3d2 100644 --- a/puzzles/search/binary_search/find_first_in_duplicate_list/__init__.py +++ b/puzzles/search/binary_search/find_first_in_duplicate_list/__init__.py @@ -1,7 +1,7 @@ from typing import List, Optional -def find_first_in_duplicates_linear(numbers: List[int], target:int) -> Optional[int]: +def find_first_in_duplicates_linear(numbers: List[int], target: int) -> Optional[int]: """ Finds the first duplicate number that matches the target from the sorted numbers list. if not found, None is returned. @@ -26,7 +26,7 @@ def find_first_in_duplicates_linear(numbers: List[int], target:int) -> Optional[ return None -def find_first_in_duplicates(numbers: List[int], target:int) -> Optional[int]: +def find_first_in_duplicates(numbers: List[int], target: int) -> Optional[int]: """ Finds the first duplicate number that matches the target from the sorted numbers list. if not found, None is returned. @@ -51,11 +51,11 @@ def find_first_in_duplicates(numbers: List[int], target:int) -> Optional[int]: # If the middle number is less than the target, we move the low/left pointer to the middle + 1, eliminating the # left portion of the list if numbers[mid] < target: - low = mid +1 + low = mid + 1 elif numbers[mid] > target: # if the middle number is greater than the target, we move the right/high pointer to the middle-1, removing # the right portion of the list - high = mid -1 + high = mid - 1 else: # This else block addresses finding the first occurrence of the target element. This block is entered when # the target is equal to numbers[mid]. Since the list is sorted in ascending order, the target is either the @@ -66,7 +66,7 @@ def find_first_in_duplicates(numbers: List[int], target:int) -> Optional[int]: return mid # next is to check if the element to the left of numbers[mid], i.e. numbers[mid-1] is the target or not. It # is not, this evaluates to true and implies that numbers[mid] is the first occurrence, so mid is returned - if numbers[mid -1] != target: + if numbers[mid - 1] != target: return mid # However, if the element on the left is also the same as the target element, we update high to mid - 1. This # way, we condense our search space to find the first occurrence of the target which will be on the left of diff --git a/puzzles/search/binary_search/find_first_in_duplicate_list/test_find_first_in_duplicates.py b/puzzles/search/binary_search/find_first_in_duplicate_list/test_find_first_in_duplicates.py index 0f353f4a..ba843d7c 100644 --- a/puzzles/search/binary_search/find_first_in_duplicate_list/test_find_first_in_duplicates.py +++ b/puzzles/search/binary_search/find_first_in_duplicate_list/test_find_first_in_duplicates.py @@ -11,6 +11,7 @@ def test_1(self): actual = find_first_in_duplicates_linear(numbers, target) self.assertEqual(expected, actual) + class FindFirstEntryInDuplicateListTestCases(unittest.TestCase): def test_1(self): """should return 3 for numbers=[-14, -10, 2, 108, 108, 243, 285, 285, 285, 401] and target=108""" @@ -21,5 +22,5 @@ def test_1(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/puzzles/search/binary_search/find_fixed_number/test_find_fixed_number.py b/puzzles/search/binary_search/find_fixed_number/test_find_fixed_number.py index 46f81351..a1e12291 100644 --- a/puzzles/search/binary_search/find_fixed_number/test_find_fixed_number.py +++ b/puzzles/search/binary_search/find_fixed_number/test_find_fixed_number.py @@ -44,5 +44,5 @@ def test_fixed_point_linear_3(self): self.assertIsNone(actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/puzzles/search/binary_search/integer_square_root/test_integer_square_root.py b/puzzles/search/binary_search/integer_square_root/test_integer_square_root.py index 5355a0ca..abc1405c 100644 --- a/puzzles/search/binary_search/integer_square_root/test_integer_square_root.py +++ b/puzzles/search/binary_search/integer_square_root/test_integer_square_root.py @@ -18,5 +18,5 @@ def test_3(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/puzzles/stack/decimal_to_binary/test_decimal_to_binary.py b/puzzles/stack/decimal_to_binary/test_decimal_to_binary.py index 0cc130cd..2af19c6a 100644 --- a/puzzles/stack/decimal_to_binary/test_decimal_to_binary.py +++ b/puzzles/stack/decimal_to_binary/test_decimal_to_binary.py @@ -28,5 +28,5 @@ def test_10(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/puzzles/stack/reverse_string/test_reverse_string.py b/puzzles/stack/reverse_string/test_reverse_string.py index 0b2c9084..4e6bc6f0 100644 --- a/puzzles/stack/reverse_string/test_reverse_string.py +++ b/puzzles/stack/reverse_string/test_reverse_string.py @@ -10,5 +10,5 @@ def test_one(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/pystrings/anagram/__init__.py b/pystrings/anagram/__init__.py index e9d11030..41a9f667 100755 --- a/pystrings/anagram/__init__.py +++ b/pystrings/anagram/__init__.py @@ -83,7 +83,6 @@ def detect_anagrams(self, word, word_list): res.append(x) return res - def anagram_count(self, parent, child): """ Counts the number of times the anagram of a child string appears in a parent string diff --git a/pystrings/anagram/group_anagrams/__init__.py b/pystrings/anagram/group_anagrams/__init__.py index ec776dfc..1a58fbda 100644 --- a/pystrings/anagram/group_anagrams/__init__.py +++ b/pystrings/anagram/group_anagrams/__init__.py @@ -21,6 +21,7 @@ def group_anagrams_naive(strs: List[str]) -> List[List[str]]: return list(word_map.values()) + def group_anagrams(strs: List[str]) -> List[List[str]]: """ Groups a list of strings by their anagrams. @@ -55,12 +56,12 @@ def group_anagrams(strs: List[str]) -> List[List[str]]: Returns: List[List[str]]: A list of lists, where each inner list contains strings that are anagrams of each other """ - word_map: Dict[Tuple[int,...], List[str]] = defaultdict(list) + word_map: Dict[Tuple[int, ...], List[str]] = defaultdict(list) # traversing the list of strings takes O(n) time where n is the number of strings in this list for word in strs: count = [0] * 26 for char in word.lower(): - index = ord(char) - ord('a') + index = ord(char) - ord("a") count[index] += 1 key = tuple(count) diff --git a/pystrings/anagram/group_anagrams/test_group_anagrams.py b/pystrings/anagram/group_anagrams/test_group_anagrams.py index 269ae2d6..bdc0ea07 100644 --- a/pystrings/anagram/group_anagrams/test_group_anagrams.py +++ b/pystrings/anagram/group_anagrams/test_group_anagrams.py @@ -4,26 +4,70 @@ class GroupAnagramsTestCase(unittest.TestCase): - @parameterized.expand([ - ("test_1", ["eat", "beat", "neat", "tea"], [["eat", "tea"], ["beat"], ["neat"]]), - ("test_2", ["duel", "dule", "speed", "spede", "deul", "cars"], [["duel", "dule", "deul"], ["speed", "spede"], ["cars"]]), - ("test_3", ["eat","tea","tan","ate","nat","bat"], [["eat","tea","ate"],["tan","nat"],["bat"]]), - ("test_4", ["word","sword","drow","rowd","iced","dice"], [["word","drow","rowd"],["sword"],["iced","dice"]]), - ("test_5", ["eat","drink","sleep","repeat"], [["eat"],["drink"],["sleep"],["repeat"]]), - ("test_6", ["hello","ohlle","dark"], [["hello","ohlle"],["dark"]]) - ]) + @parameterized.expand( + [ + ( + "test_1", + ["eat", "beat", "neat", "tea"], + [["eat", "tea"], ["beat"], ["neat"]], + ), + ( + "test_2", + ["duel", "dule", "speed", "spede", "deul", "cars"], + [["duel", "dule", "deul"], ["speed", "spede"], ["cars"]], + ), + ( + "test_3", + ["eat", "tea", "tan", "ate", "nat", "bat"], + [["eat", "tea", "ate"], ["tan", "nat"], ["bat"]], + ), + ( + "test_4", + ["word", "sword", "drow", "rowd", "iced", "dice"], + [["word", "drow", "rowd"], ["sword"], ["iced", "dice"]], + ), + ( + "test_5", + ["eat", "drink", "sleep", "repeat"], + [["eat"], ["drink"], ["sleep"], ["repeat"]], + ), + ("test_6", ["hello", "ohlle", "dark"], [["hello", "ohlle"], ["dark"]]), + ] + ) def test1(self, _, strs, expected): actual = group_anagrams(strs) self.assertEqual(actual, expected) - @parameterized.expand([ - ("test_1", ["eat", "beat", "neat", "tea"], [["eat", "tea"], ["beat"], ["neat"]]), - ("test_2", ["duel", "dule", "speed", "spede", "deul", "cars"], [["duel", "dule", "deul"], ["speed", "spede"], ["cars"]]), - ("test_3", ["eat","tea","tan","ate","nat","bat"], [["eat","tea","ate"],["tan","nat"],["bat"]]), - ("test_4", ["word","sword","drow","rowd","iced","dice"], [["word","drow","rowd"],["sword"],["iced","dice"]]), - ("test_5", ["eat","drink","sleep","repeat"], [["eat"],["drink"],["sleep"],["repeat"]]), - ("test_6", ["hello","ohlle","dark"], [["hello","ohlle"],["dark"]]) - ]) + @parameterized.expand( + [ + ( + "test_1", + ["eat", "beat", "neat", "tea"], + [["eat", "tea"], ["beat"], ["neat"]], + ), + ( + "test_2", + ["duel", "dule", "speed", "spede", "deul", "cars"], + [["duel", "dule", "deul"], ["speed", "spede"], ["cars"]], + ), + ( + "test_3", + ["eat", "tea", "tan", "ate", "nat", "bat"], + [["eat", "tea", "ate"], ["tan", "nat"], ["bat"]], + ), + ( + "test_4", + ["word", "sword", "drow", "rowd", "iced", "dice"], + [["word", "drow", "rowd"], ["sword"], ["iced", "dice"]], + ), + ( + "test_5", + ["eat", "drink", "sleep", "repeat"], + [["eat"], ["drink"], ["sleep"], ["repeat"]], + ), + ("test_6", ["hello", "ohlle", "dark"], [["hello", "ohlle"], ["dark"]]), + ] + ) def test2(self, _, strs, expected): actual = group_anagrams_naive(strs) self.assertEqual(actual, expected) @@ -41,29 +85,29 @@ def test_2(self): self.assertEqual(expected, actual) def test_3(self): - strs = ["eat","tea","tan","ate","nat","bat"] - expected = [["eat","tea","ate"],["tan","nat"],["bat"]] + strs = ["eat", "tea", "tan", "ate", "nat", "bat"] + expected = [["eat", "tea", "ate"], ["tan", "nat"], ["bat"]] actual = group_anagrams(strs) self.assertEqual(expected, actual) def test_4(self): - strs = ["word","sword","drow","rowd","iced","dice"] - expected = [["word","drow","rowd"],["sword"],["iced","dice"]] + strs = ["word", "sword", "drow", "rowd", "iced", "dice"] + expected = [["word", "drow", "rowd"], ["sword"], ["iced", "dice"]] actual = group_anagrams(strs) self.assertEqual(expected, actual) def test_5(self): - strs = ["eat","drink","sleep","repeat"] - expected = [["eat"],["drink"],["sleep"],["repeat"]] + strs = ["eat", "drink", "sleep", "repeat"] + expected = [["eat"], ["drink"], ["sleep"], ["repeat"]] actual = group_anagrams(strs) self.assertEqual(expected, actual) def test_6(self): - strs = ["hello","ohlle","dark"] - expected = [["hello","ohlle"],["dark"]] + strs = ["hello", "ohlle", "dark"] + expected = [["hello", "ohlle"], ["dark"]] actual = group_anagrams(strs) self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/pystrings/count_consonants/__init__.py b/pystrings/count_consonants/__init__.py index e40e5560..f006b9f1 100644 --- a/pystrings/count_consonants/__init__.py +++ b/pystrings/count_consonants/__init__.py @@ -1,14 +1,16 @@ vowels = "aeiou" + def count_consonants_iterative(input_str: str) -> int: consonant_count = 0 for char in input_str: if char.lower() not in vowels and char.isalpha(): - consonant_count+=1 + consonant_count += 1 return consonant_count + def count_consonants_recursive(input_str: str) -> int: if input_str == "": return 0 diff --git a/pystrings/count_consonants/test_count_consonants.py b/pystrings/count_consonants/test_count_consonants.py index 28e99efe..43034143 100644 --- a/pystrings/count_consonants/test_count_consonants.py +++ b/pystrings/count_consonants/test_count_consonants.py @@ -1,6 +1,9 @@ import unittest -from pystrings.count_consonants import count_consonants_iterative, count_consonants_recursive +from pystrings.count_consonants import ( + count_consonants_iterative, + count_consonants_recursive, +) class CountConsonantsTestCases(unittest.TestCase): @@ -19,5 +22,5 @@ def test_1_recursive(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/pystrings/inttostr/__init__.py b/pystrings/inttostr/__init__.py index e99f9ee6..dfd3b2ca 100644 --- a/pystrings/inttostr/__init__.py +++ b/pystrings/inttostr/__init__.py @@ -22,7 +22,7 @@ def int_to_str(input_int: int) -> str: # if the input integer is 0, then simply append '0' to the output result if input_int == 0: - output_str.append('0') + output_str.append("0") else: # if not, then the last digit of the input integer is extracted using the % operator. e.g. 12 % 10 = 2, 17%10=7 # Taking the modulus of a number with 10, always gets the last digit of that number. @@ -33,7 +33,7 @@ def int_to_str(input_int: int) -> str: # This repeats until the input integer is less than or equal to 0 while input_int > 0: last_digit = input_int % 10 - unicode = ord('0') + last_digit + unicode = ord("0") + last_digit character = chr(unicode) output_str.append(character) input_int //= 10 @@ -42,10 +42,10 @@ def int_to_str(input_int: int) -> str: output_str = output_str[::-1] # join the elements together - result = ''.join(output_str) + result = "".join(output_str) # deal with the sign. Add - if it was a negative integer or simply return the result if it was a positive integer. if is_negative: - return '-' + result + return "-" + result else: return result diff --git a/pystrings/inttostr/test_int_to_str.py b/pystrings/inttostr/test_int_to_str.py index 13be9bd5..5ccec699 100644 --- a/pystrings/inttostr/test_int_to_str.py +++ b/pystrings/inttostr/test_int_to_str.py @@ -32,5 +32,5 @@ def test_4(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/pystrings/is_unique/test_is_unique.py b/pystrings/is_unique/test_is_unique.py index 3d7f9c91..34644acf 100644 --- a/pystrings/is_unique/test_is_unique.py +++ b/pystrings/is_unique/test_is_unique.py @@ -3,7 +3,6 @@ class IsUniqueTestCases(unittest.TestCase): - def test_1(self): """should return true for abCDefGh""" input_string = "abCDefGh" @@ -38,8 +37,10 @@ def test_6(self): """should return True for hi""" input_string = "hi" actual = is_unique(input_string) - self.assertTrue(actual,) + self.assertTrue( + actual, + ) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/pystrings/look_and_say_sequence/__init__.py b/pystrings/look_and_say_sequence/__init__.py index 5d4e7726..0748c9a6 100644 --- a/pystrings/look_and_say_sequence/__init__.py +++ b/pystrings/look_and_say_sequence/__init__.py @@ -27,7 +27,7 @@ def look_and_say_sequence(sequence: str) -> str: # count is reset to one to keep track of the current count of the sequence count = 1 - while i + 1 < len(sequence) and sequence[i] == sequence[i+1]: + while i + 1 < len(sequence) and sequence[i] == sequence[i + 1]: # here we keep track of consecutive similar characters and increase their count if we encounter them. i += 1 diff --git a/pystrings/look_and_say_sequence/test_look_and_say_sequence.py b/pystrings/look_and_say_sequence/test_look_and_say_sequence.py index d3a02365..baacac09 100644 --- a/pystrings/look_and_say_sequence/test_look_and_say_sequence.py +++ b/pystrings/look_and_say_sequence/test_look_and_say_sequence.py @@ -25,5 +25,5 @@ def test_3(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/pystrings/palindrome/permutation_palindrome/test_permutation_palindrome.py b/pystrings/palindrome/permutation_palindrome/test_permutation_palindrome.py index 5d9a01b1..e5259f1b 100644 --- a/pystrings/palindrome/permutation_palindrome/test_permutation_palindrome.py +++ b/pystrings/palindrome/permutation_palindrome/test_permutation_palindrome.py @@ -42,5 +42,5 @@ def test_3(self): self.assertTrue(actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/pystrings/permutation/__init__.py b/pystrings/permutation/__init__.py index 7eb5d24c..08ef9d26 100644 --- a/pystrings/permutation/__init__.py +++ b/pystrings/permutation/__init__.py @@ -36,6 +36,7 @@ def check_permutation_with_sorting(input_str_1: str, input_str_2: str) -> bool: return True + def check_permutation_with_map(input_str_1: str, input_str_2: str) -> bool: """ Check if two strings are permutations of each other. diff --git a/pystrings/permutation/test_check_permutation.py b/pystrings/permutation/test_check_permutation.py index 6f8c4549..e90b2db3 100644 --- a/pystrings/permutation/test_check_permutation.py +++ b/pystrings/permutation/test_check_permutation.py @@ -33,5 +33,6 @@ def test_2(self): actual = check_permutation_with_map(word_1, word_2) self.assertFalse(actual) -if __name__ == '__main__': + +if __name__ == "__main__": unittest.main() diff --git a/pystrings/spreadsheet_encoding/__init__.py b/pystrings/spreadsheet_encoding/__init__.py index cd60c288..52f9c692 100644 --- a/pystrings/spreadsheet_encoding/__init__.py +++ b/pystrings/spreadsheet_encoding/__init__.py @@ -24,7 +24,7 @@ def spreadsheet_encode_column(column_id: str) -> int: # relative difference from the result given by ord & from the representation we require for base 26 system # Now we know that ord('A') equals 65. So if we find the Unicode code point using ord() of a character, # subtract ord('A') from it, and then add 1 to it, we’ll get the representation we want for the base 26 system - num += 26**count * (ord(char) - ord('A') + 1) + num += 26**count * (ord(char) - ord("A") + 1) # count is decremented by 1 as the power of the base decrements by 1 from the digits from left to right count -= 1 diff --git a/pystrings/spreadsheet_encoding/test_spreadsheet_encode.py b/pystrings/spreadsheet_encoding/test_spreadsheet_encode.py index 477111a9..c95a9fa0 100644 --- a/pystrings/spreadsheet_encoding/test_spreadsheet_encode.py +++ b/pystrings/spreadsheet_encoding/test_spreadsheet_encode.py @@ -8,8 +8,8 @@ def test_zz(self): column_name = "ZZ" expected = 702 actual = spreadsheet_encode_column(column_name) - self.assertEqual(expected,actual) + self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/pystrings/string_length/__init__.py b/pystrings/string_length/__init__.py index 45b3d81d..2e524fa9 100644 --- a/pystrings/string_length/__init__.py +++ b/pystrings/string_length/__init__.py @@ -12,6 +12,7 @@ def iterative_string_len(input_str: str) -> int: count += 1 return count + def recursive_string_len(input_str: str) -> int: """ Calculates a string's length using a recursive approach @@ -23,4 +24,4 @@ def recursive_string_len(input_str: str) -> int: """ if input_str == "": return 0 - return 1 + recursive_string_len(input_str[1:]) \ No newline at end of file + return 1 + recursive_string_len(input_str[1:]) diff --git a/pystrings/string_length/test_string_length.py b/pystrings/string_length/test_string_length.py index 36a898f6..2e789342 100644 --- a/pystrings/string_length/test_string_length.py +++ b/pystrings/string_length/test_string_length.py @@ -18,5 +18,5 @@ def test_1_recursive(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/pystrings/strtoint/__init__.py b/pystrings/strtoint/__init__.py index df391c58..0f760b14 100644 --- a/pystrings/strtoint/__init__.py +++ b/pystrings/strtoint/__init__.py @@ -8,7 +8,7 @@ def str_to_int(input_str: str) -> int: """ output_int = 0 - if input_str[0] == '-': + if input_str[0] == "-": is_negative = True else: is_negative = False @@ -18,17 +18,18 @@ def str_to_int(input_str: str) -> int: str_to_convert = input_str[1:] if is_negative else input_str for index, char in enumerate(str_to_convert): - unicode = ord(char) - ord('0') + unicode = ord(char) - ord("0") exponent = l - (index + 1) number = unicode * 10**exponent output_int += number - return output_int *-1 if is_negative else output_int + return output_int * -1 if is_negative else output_int + def str_to_int_v2(input_str: str) -> int: output_int = 0 - if input_str[0] == '-': + if input_str[0] == "-": start_idx = 1 is_negative = True else: @@ -36,8 +37,8 @@ def str_to_int_v2(input_str: str) -> int: is_negative = False for i in range(start_idx, len(input_str)): - place = 10**(len(input_str) - (i+1)) - digit = ord(input_str[i]) - ord('0') + place = 10 ** (len(input_str) - (i + 1)) + digit = ord(input_str[i]) - ord("0") output_int += place * digit if is_negative: diff --git a/pystrings/strtoint/test_string_to_int.py b/pystrings/strtoint/test_string_to_int.py index 5fce3540..42ea6986 100644 --- a/pystrings/strtoint/test_string_to_int.py +++ b/pystrings/strtoint/test_string_to_int.py @@ -104,5 +104,5 @@ def test_7(self): self.assertEqual(expected, actual) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() From 5a5d7a1f211aaf63ebe7cf30a655a97d21f5c4cb Mon Sep 17 00:00:00 2001 From: Lusina <12752833+BrianLusina@users.noreply.github.com> Date: Thu, 13 Nov 2025 10:08:39 +0300 Subject: [PATCH 6/6] chore(lint): minor format fixes --- algorithms/sliding_window/repeated_dna_sequences/__init__.py | 2 +- .../test_maxlen_contiguous_binary_subarray.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/algorithms/sliding_window/repeated_dna_sequences/__init__.py b/algorithms/sliding_window/repeated_dna_sequences/__init__.py index 64450743..a870b6b8 100644 --- a/algorithms/sliding_window/repeated_dna_sequences/__init__.py +++ b/algorithms/sliding_window/repeated_dna_sequences/__init__.py @@ -47,7 +47,7 @@ def find_repeated_dna_sequences(dna_sequence: str) -> List[str]: # Validate input contains only valid DNA bases if not all(c in to_int for c in dna_sequence): raise ValueError( - f"DNA sequence contains invalid characters. Only A, C, G, T are allowed." + "DNA sequence contains invalid characters. Only A, C, G, T are allowed." ) encoded_sequence = [to_int[c] for c in dna_sequence] diff --git a/puzzles/arrays/maxlen_contiguous_binary_subarray/test_maxlen_contiguous_binary_subarray.py b/puzzles/arrays/maxlen_contiguous_binary_subarray/test_maxlen_contiguous_binary_subarray.py index eff8f046..730fb49a 100644 --- a/puzzles/arrays/maxlen_contiguous_binary_subarray/test_maxlen_contiguous_binary_subarray.py +++ b/puzzles/arrays/maxlen_contiguous_binary_subarray/test_maxlen_contiguous_binary_subarray.py @@ -1,5 +1,5 @@ import unittest - +import random from . import find_max_length @@ -50,7 +50,6 @@ def test_0_0_1_1_1_0_0_0_0_0_returns_6(self): self.assertEqual(expected, actual) -@test.describe("Random Tests") def tests(): def check(s) -> int: Track, balance, index, len1 = {}, 0, 0, 0 @@ -83,7 +82,6 @@ def shuffs(s): test.assert_equals(binarray(s.copy()), answer) def rnd_tests(title, l, m, flag): - @test.it(title + " size") def _(): for _ in range(l): if flag: