forked from keon/algorithms
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add algorithm that tests knowledge of strings (keon#234)
* Add a function that validates latitude and longitude. * Update README.md by adding validate_coordinates.py * Fix indentation error * Fix indentation errors and follow PEP8 * Add import statement for unittest * Fix function names * Add delete_reocurring_characters * Update README.md by adding delete_reoccuring_char * Add PR review changes
- Loading branch information
1 parent
bd62587
commit 2e35011
Showing
3 changed files
with
88 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
""" | ||
QUESTION: Given a string as your input, delete any reoccurring | ||
character, and return the new string. | ||
This is a Google warmup interview question that was asked duirng phone screening | ||
at my university. | ||
""" | ||
|
||
# time complexity O(n) | ||
def delete_reoccurring_characters(string): | ||
seen_characters = set() | ||
output_string = '' | ||
for char in string: | ||
if char not in seen_characters: | ||
seen_characters.add(char) | ||
output_string += char | ||
return output_string | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
"""" | ||
Create a function that will validate if given parameters are valid geographical coordinates. | ||
Valid coordinates look like the following: "23.32353342, -32.543534534". The return value should be either true or false. | ||
Latitude (which is first float) can be between 0 and 90, positive or negative. Longitude (which is second float) can be between 0 and 180, positive or negative. | ||
Coordinates can only contain digits, or one of the following symbols (including space after comma) -, . | ||
There should be no space between the minus "-" sign and the digit after it. | ||
Here are some valid coordinates: | ||
-23, 25 | ||
43.91343345, 143 | ||
4, -3 | ||
And some invalid ones: | ||
23.234, - 23.4234 | ||
N23.43345, E32.6457 | ||
6.325624, 43.34345.345 | ||
0, 1,2 | ||
""" | ||
# I'll be adding my attempt as well as my friend's solution (took us ~ 1 hour) | ||
|
||
# my attempt | ||
import re | ||
def is_valid_coordinates_0(coordinates): | ||
for char in coordinates: | ||
if not (char.isdigit() or char in ['-', '.', ',', ' ']): | ||
return False | ||
l = coordinates.split(", ") | ||
if len(l) != 2: | ||
return False | ||
print(l) | ||
try: | ||
latitude = float(l[0]) | ||
longitude = float(l[1]) | ||
except: | ||
return False | ||
print(latitude, longitude) | ||
return -90 <= latitude <= 90 and -180 <= longitude <= 180 | ||
|
||
# friends solutions | ||
def is_valid_coordinates_1(coordinates): | ||
try: | ||
lat, lng = [abs(float(c)) for c in coordinates.split(',') if 'e' not in c] | ||
except ValueError: | ||
return False | ||
|
||
return lat <= 90 and lng <= 180 | ||
|
||
# using regular expression | ||
def is_valid_coordinates_regular_expression(coordinates): | ||
return bool(re.match("-?(\d|[1-8]\d|90)\.?\d*, -?(\d|[1-9]\d|1[0-7]\d|180)\.?\d*$", coordinates)) | ||
|
||
import unittest | ||
class TestSuite(unittest.TestCase): | ||
def test_valid(self): | ||
valid_coordinates = ["-23, 25","4, -3","90, 180","-90, -180"] | ||
for coordinate in valid_coordinates: | ||
self.assertTrue(is_valid_coordinates_0(coordinate)) | ||
|
||
def test_invalid(self): | ||
invalid_coordinates = ["23.234, - 23.4234","99.234, 12.324","6.325624, 43.34345.345","0, 1,2","23.245, 1e1"] | ||
for coordinate in invalid_coordinates: | ||
self.assertFalse(is_valid_coordinates_0(coordinate)) | ||
|
||
|
||
if __name__ == "__main__": | ||
unittest.main() |