首页 > 代码库 > 软件开发训练 OJ 练习02
软件开发训练 OJ 练习02
字符串IP地址判断
描述:判断输入的字符串是不是一个有效的IP地址
接口:boolisIPAddressValid(constchar* pszIPAddr)
输入:pszIPAddr
字符串
输出:true
有效的IP地址,false
无效的IP地址
约束:
- 输入IP为
XXX.XXX.XXX.XXX
格式 - 字符串两端含有空格认为是合法IP
- 字符串中间含有空格认为是不合法IP
- 类似于
01.1.1.1
,1.02.3.4
IP子段以0开头为不合法IP - 子段为单个0 认为是合法IP,
0.0.0.0
也算合法IP
代码
#include <iostream> #include <ctype.h> using namespace std; bool isIPAddressValid(const char* pszIPAddr) { if (pszIPAddr == NULL) return false; const char* a = pszIPAddr; int begin, end, len; len = strlen(pszIPAddr); for (begin = 0; begin < len; ++begin) { if (a[begin] != ' ') break; } for (end = len - 1; end >= 0; --end) { if (a[end] != ' ') { break; } } if (begin >= end || !isdigit(a[begin]) || !isdigit(a[end])) return false; struct state { char currrent; char previous; int charSeqNum; int pointNum; } st = { 0, 0, 0, 0 }; int i, j, num; for (i = begin; i <= end; ++i) { st.previous = st.currrent; st.currrent = a[i]; if (st.currrent == '.') { if (st.previous == '.') return false; st.pointNum++; if (st.pointNum > 3) return false; num = a[i - st.charSeqNum] - '0'; for (j = 1; j < st.charSeqNum; ++j) { num = num * 10 + a[i - st.charSeqNum + j] - '0'; } if (num > 255) { return false; } st.charSeqNum = 0; } else if (isdigit(st.currrent)) { st.charSeqNum++; if (st.previous == '0' && st.charSeqNum == 2) { return false; } if (st.charSeqNum > 3) { return false; } if (i == end) { num = a[i + 1 - st.charSeqNum] - '0'; for (j = 1; j < st.charSeqNum; ++j) { num = num * 10 + a[i + 1 - st.charSeqNum + j] - '0'; } if (num > 255) { return false; } } } else { return false; } } if (st.pointNum != 3) return false; return true; } int main() { const char* a = " 110.1.210.1 "; bool b = isIPAddressValid(a); cout << b; }
查找兄弟单词
实现一个可存储若干个单词的字典,实现以下功能:
- 在字典中加入单词,不能重复,单词由小写英文字母组成,不含其它字符;
- 查找指定单词在字典中的兄弟单词个数;
- 查找指定单词的指定序号的兄弟单词,指定序号指字典中兄弟单词按字典顺序, 排序后的序号从1开始;
- 清空字典中所有单词;
代码
#include <set> #include <string> #include <vector> #include <algorithm> #include <iostream> using namespace std; set<string> dict; int AddOneWord(char* Word) { string a = Word; if (dict.insert(a).second) return 0; else return -1; } bool isBro(string a, string b) { sort(a.begin(), a.end()); sort(b.begin(), b.end()); return a == b; } int FindSimilarWordNum(char* Word) { string a = Word; set<string>::iterator it; int count = 0; for (it = dict.begin(); it != dict.end(); ++it) { if (a != *it && isBro(a, *it)) ++count; } return count; } int FindOneSimilarWord(char* Word, int Seq, char* SimilarWord) { string a = Word; vector<string> ve; set<string>::iterator it; for (it = dict.begin(); it != dict.end(); ++it) { if (a != *it && isBro(a, *it)) { ve.push_back(*it); } } if (ve.size() == 0 || Seq > ve.size()) { *SimilarWord = '\0'; return -1; } else { ve[Seq - 1].copy(SimilarWord, ve[Seq - 1].length(), 0); return 0; } } void ClearAllWords(void) { dict.clear(); } int main() { char *Test_Word[7] = { "mock", "aabc", "abc", "ckom", "bcaa", "abca", }; AddOneWord(Test_Word[0]); AddOneWord(Test_Word[1]); AddOneWord(Test_Word[2]); AddOneWord(Test_Word[3]); AddOneWord(Test_Word[4]); AddOneWord(Test_Word[5]); int a = FindSimilarWordNum(Test_Word[0]); cout << a << endl; char *ExpectWord = {"bcaa"}; char SimilarWord[51] = {'\0'}; int Seq = 2; int b = FindOneSimilarWord (Test_Word[1], Seq, SimilarWord); cout << b << endl; cout << SimilarWord; }
整形字符串排序
给定字符串内有很多正整数,要求对这些正整数进行排序,然后返回排序后指定位置的正整数 排序要求:按照每个正整数的后三位数字组成的整数进行从小到大排序。
- 如果不足三位,则按照实际位数组成的整数进行比较
- 如果相等,则按照输入字符串中的原始顺序排序
说明(以下内容考生无须检查,调用者保证):
- 字符串以’\0’结尾,仅包含数字、空格
- 字符串内正整数之间以单个空格分隔,字符串首尾没有空格
- 正整数格式为十进制,大小:1~1000000,正整数的数字非零开始
示例: 如字符串内容 1223 22 3232 2016
, 按照规定排序后 2016 22 1223 3232
,查询排序后的第3个数是 1223
.
代码
#include <iostream> #include <vector> #include <algorithm> #include <stdio.h> using namespace std; bool comp(const int &a, const int &b) { return a % 1000 < b % 1000; } int find_string(const char* input_string, int serial_number, int output_string_max_length, char* output_string) { if (input_string == 0 || !*input_string) { *output_string = '\0'; return -1; } vector<int> nums; int n = 0; const char *p = input_string; while (*p) { if (*p == ' ') { nums.push_back(n); n = 0; ++p; continue; } n = n * 10 + *p - '0'; ++p; } nums.push_back(n); sort(nums.begin(), nums.end(), comp); if(serial_number > nums.size()){ *output_string = '\0'; return -1; } int a = nums[serial_number - 1]; int k = 0, tt = a; while(tt != 0){ ++k; tt /= 10; } if(output_string_max_length <= k){ *output_string = '\0'; return -1; } sprintf(output_string, "%d", a); return 0; } int main() { const char *in_str = "1223 22 3232 2016"; char out_str[5]; find_string(in_str, 3, sizeof(out_str), out_str); cout << out_str; // 1223 }
在字符串中找出最长连续的数字串
请一个在字符串中找出连续最长的数字串,并把这个串的长度返回;如果存在长度相同的连续数字串,返回最后一个连续数字串; 注意:数字串只需要是数字组成的就可以,并不要求顺序,比如数字串“1234”的长度就小于数字串“1359055”,如果没有数字,则返回空字符串(“”)而不是NULL!
样例输入: abcd12345ed125ss123058789
样例输出: 输出123058789,函数返回值 9
函数接口: unsignedint Continumax(char** pOutputstr, char* intputstr)
输入参数:char* intputstr
输入字符串;
输出参数:char** pOutputstr
连续最长的数字串,如果连续最长的数字串的长度为0,应该返回空字符串;如果输入字符串是空,也应该返回空字符串;
返回值:连续最长的数字串的长度
代码
unsigned int Continumax(char** pOutputstr, char* intputstr){ if( intputstr == NULL ){ *pOutputstr = (char*)malloc(2); **pOutputstr = '\0'; return 0; } *pOutputstr = (char*)malloc(strlen(intputstr)+1); char *p = intputstr; unsigned int count = 0; unsigned int max = 0; char *pcur,*pre; pcur = p; pre = p; while(*p){ if( isdigit(*p) ){ pcur = p; while( isdigit(*p) ){ ++count; ++p; } } if(count >= max){ max = count; pre = pcur; } count = 0; ++p; } if(max == 0) { **pOutputstr = '\0'; } else { char *pt = *pOutputstr; unsigned int i = 0; for(; i < max; ++i){ *pt++ = *pre++; } *pt = '\0'; } return max; }
Fibonacci 数列的计算和转换
求解扩展Fibanacci的第n项和前n项和
输入扩展Fibanacci数列的前2个数字和要求的数字序号 n,返回第n个数值
输入扩展Fibanacci数列的前2个数字和要求的数字序号 n,返回前n项之和
代码
#include <iostream> using namespace std; int GetExtFibonacci(int first, int second, int num) { int re, i; if (num == 1) return first; if (num == 2) return second; for (i = 3; i <= num; ++i) { re = first + second; first = second; second = re; } return re; } int CalcTotalValueOfExtFibonacci(int first, int second, int num) { int re, i; if (num == 1) return first; if (num == 2) return first + second; int count = first + second; for (i = 3; i <= num; ++i) { re = first + second; first = second; second = re; count += re; } return count; } int main() { cout<< GetExtFibonacci(1, 1, 5); cout<<"\n"; cout<< CalcTotalValueOfExtFibonacci(1,1,5); }
软件开发训练 OJ 练习02