Author | Post | |||
moose |
Hi, I thought it's time to me to learn C++. To train, I've took a look at TopCoder and just found this exercise ( SRM 100 - Motorola Single Round Match 100 Round 1 - Division II, Level One, Link): Problem Statement A letter-string is composed of letters ('A'-'Z','a'-'z') and dashes ('-'). The length of a letter-string is the number of characters in it not including dashes (in other words, the number of letters in the string). Given a list of letter-strings you will return the sum of their lengths. Create a class LetterStrings that contains the method sum, which takes a String[], s, and returns an int representing the sum of the lengths of the given letter-strings. Definition Class: LetterStrings Method: sum Parameters: String[] Returns: int Method signature: int sum(String[] s) (be sure your method is public) Constraints - s will contain between 1 and 50 elements, inclusive. - Each element of s will have length between 1 and 50, inclusive. - Each element of s will contain only letters ('A'-'Z','a'-'z') and dashes ('-'). Examples 0) {"-"} Returns: 0 1) {"A"} Returns: 1 2) {"-----Abc"} Returns: 3 3) {"-A-B-C-D", "--------EFGHI", "JKLMNOPQR", "---STU-VW-XYZ"} Returns: 26 Now I've created this piece of code: #include <iostream> #include <string> using namespace std; class LetterStrings { public: int sum(string s[]); }; int LetterStrings::sum(string s[]) { int summe = 0; for(int el=0; s[el] != "\0"; el++){ for(int i=0; i < s[el].length(); i++){ if( isalpha(s[el][i]) ) { summe += 1; } } } return summe; } int main() { LetterStrings a, b; string str[5] = {"-A-B-C-D", "--------EFGHI", "JKLMNOPQR", "---STU-VW-XYZ"}; cout << a.sum(str) << endl; } It seems to work, but I'm not quite sure if it fits the requirements (Method signature: int sum(String[] s)?) What could be done better in this code? edit: Just found the statistics with the top-solution: #include <string> #include <vector> #include <sstream> #include <algorithm> #include <iterator> #include <iostream> #include <cmath> #include <cctype> #include <cstdio> #include <utility> using namespace std; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define VI vector<int> #define VVI vector<vector<int> > #define VS vector<string> #define si size() #define len length() //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class LetterStrings { public: int sum(vector <string> s) { int ret=0; for(int c=0;c<s.si;c++) for(int d=0;d<s[c].len;d++) if(isalpha(s[c][d])) ret++; return ret; } }; // Powered by PopsEdit isalpha is obviously better then my check via ASCII-Table codes (I've edited my solution), but the top-solutions seems to include quite a lot which isn't needed. |
|||
Edited by moose on 08.09.2011 11:01:45 | ||||
15.08.2011 15:22:56 |
|
|||
dloser |
Hi moose, Quote from moose: I thought it's time to me to learn C++. Oh boy... Quote: It seems to work, but I'm not quite sure if it fits the requirements (Method signature: int sum(String[] s)?) I suspect the exercise was made with Java in mind. For C++ using vector<string> is probably closest to String[], both being classes with similar methods. Quote: What could be done better in this code? Quote: class LetterStrings { public: int sum(string s[]); }; The whole class thing is probably just because of Java, but in any case making the method sum static would be appropriate here, I think. Quote: int summe = 0; Not sticking with English... (Sorry.) Quote: for(int el=0; s[el] != "\0"; el++){ Just using "" here would work as well. Nevertheless it shows that the whole string[] business makes things ugly. For example, an empty string in the input cuts the program short. Using just char*[] (or even string*[], ugh) at least allows you to end the array with NULL (which is distinct from ""). Quote: LetterStrings a, b; Nitpicking: unused b. Quote: isalpha is obviously better then my check via ASCII-Table codes (I've edited my solution), but the top-solutions seems to include quite a lot which isn't needed. Yeah, I think that's just a bunch of standard stuff that author includes in every file. |
|||
15.08.2011 16:14:00 |
|
|||
moose |
Thanks. Now my next questions: As a python programmer I'm used to have integers which are always as big as I need them. In C++ the biggist "standard int" type seems to be "unsigned long long" which is in [0;9223372036854775807] which is [0;2^63-1]. What do I do if I need longer integer types? How do I convert an unsigned long long to a string? |
|||
Edited by moose on 08.09.2011 11:02:13 | ||||
08.09.2011 11:01:21 |
|
|||
dloser |
You'll probably want to use one of the available libraries for that (e.g. GMP). |
|||
10.09.2011 22:59:38 |
|