Skip to content

Commit

Permalink
Add algorithm that tests knowledge of strings (keon#234)
Browse files Browse the repository at this point in the history
* 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
SaadBenn authored and goswami-rahul committed Apr 17, 2018
1 parent bd62587 commit 2e35011
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 0 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,9 @@ To run the tests, clone the repo and run :
- [remove_min](stack/remove_min.py)
- [is_sorted](stack/is_sorted.py)
- [strings](strings)
- [delete_reoccurring_characters](strings/delete_reoccurring_characters.py)
- [strip_url_params](strings/strip_url_params.py)
- [validate_coordinates](strings/validate_coordinates.py)
- [domain_extractor](strings/domain_extractor.py)
- [merge_string_checker](strings/merge_string_checker.py)
- [add_binary](strings/add_binary.py)
Expand Down
19 changes: 19 additions & 0 deletions strings/delete_reoccurring.py
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


67 changes: 67 additions & 0 deletions strings/validate_coordinates.py
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()

0 comments on commit 2e35011

Please sign in to comment.