软件开发训练 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);
}
时间: 2024-08-24 23:41:12

软件开发训练 OJ 练习02的相关文章

软件开发训练 OJ 练习

Game 24点游戏算法 问题:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利 输入:4个1-10的数字.[数字允许重复,测试用例保证无异常数字] 输出:True or False #include <iostream> #include <stdlib.h> #include <string.h> #include <stdio.h> using namespace std; void cal(double re[6], double a,

《人件集 人性化的软件开发》阅读笔记02

软件开发团队中的意见: 一个软件开发团队如果想要在项目中获得最大限度的成功,取决于团队中的成员能否形成技术性一致意见.但为什么这点如此重要呢?是不是团队成员只要在诸如目录表格的布局上达成一致,或者建立一个很好的错误汇报机制就行了呢?技术性一致意见指的并不是与同事打成一片就可以了(当然,这也不是说在同事之间建立良好的关系有什么错误).技术性一致意见是指充分吸取团队中每个成员的技巧和经验,其目的是为了开发出更好的软件. 职业软件人员也许能够迅速理解一款好的软件,至少当他们看见一个好的软件时会宣称自己

简单之美-软件开发实践者的思考 02

敏捷开发最注重的是人,或者说个体.目标是提高个体的主动性,提高产出效率.敏捷开发要求团队一起工作,甚至还有客户.结对编程.迭代交付,三周为一个周期,每个周期都发布可用地.经过测试的代码.2到5个周期后进行一次发布.敏捷开发积极拥抱变化,主要依靠代码重构来配合变化. 敏捷开发的优点在于发布时间短和响应需求变化,敏捷开发的缺点是可操作性差.实践者们常常走入各种各样的误区.根本原因还是人,人的主动性还有在软件开发中的行为受各种各样因素的影响. 在需求分析阶段准备两份文档.一份使用客户的术语表达客户的故

02用隐喻来充分地理解软件开发

1.隐喻的价值 ? 隐喻的价值绝不应低估.隐喻的优点在于其可预期的效果:能被所有的人理解.不必要的沟通和误解也因此大为减低,学习与教授更为快速.实际上,隐喻是对概念进行内在化(intemalizing)和抽象(abstracting)的一种途径,它让人们在更高的层次上思考问题,从而避免地层次的错误. 2. 算法 ? 算法是一套定义明确的指令,使你能完成某个特定的任务.算法是可预测性的(predictable).确定性的(deterministic).不易变化的(no subject to cha

让你提前认识软件开发(46):首先是为人编写程序,其次才是计算机

第3部分 软件研发工作总结 首先是为人编写程序,其次才是计算机 "首先是为人编写程序,其次才是计算机",这是软件开发的基本要点,软件的生命周期贯穿于产品的开发.测试.生产.发布.用户使用.版本升级和后期维护等长期过程中,只有易读.易维护的软件代码才具有生命力. 在实际的软件开发过程中,可能是由于工作很忙的原因,很多开发人员只注重实现程序的基本功能,而忘记了编程规范,因此写出来的代码只能让计算机看懂,人要看懂很不容易.更有甚者,有些项目组为了赶进度,明确要求组员以实现产品功能为主,代码能

软件开发有多少种方式

软件开发有多少种方式: Build To Learn Build To Show Build To Serve Build To Win 其中Build To Win是我们所学习的构建之法中的核心思想.软件开发是为了什么,是为了市场.赢得了市场,就是这个软件最大的成功.当然一个软件能够成功.就需要在工作中一视同仁,不能有高低贵贱之分.听取小组中每位成员的建议.并且每位程序员也能有很强的工作能力,所以我们必须要在平时的学习在加强对工作能力的训练.为未来的就业打好基础!

敏捷软件开发VS传统软件开发

敏捷软件开发VS传统软件开发 软件开发方法是软件工程理论的重要内容,在软件开发方法中,对于开发软件时的"做什么"和"如何做",给出了明确的.详细的回答.那软件开发方法的"做什么"和"如何做"之间究竟有什么异同? 下面本文就传统软件开发和敏捷软件开发的来探讨一下. 关于传统软件开发 在软件开发方法出现之前,人们普遍错误的认为开发软件只是编写程序.当时,软件开发活动个体化非常严重,编写程序随心所欲,过分追求编程技巧,造成程序很难阅

小议敏捷软件开发与传统软件工程

敏捷软件开发与传统软件工程 一.前言 随着社会和科技的不断发展,信息产业己经和人们的生活息息相关,成为不可或缺的一部分.软件工程作为信息产业的核心部分发生了翻天覆地的变化.传统的软件工程思想己经越来越不适应快速变化的信息社会,为此一种新软件工程思想-----敏捷软件开发进入了我们的视野. 二.软件工程 (一)概述 Software engineering is the application of engineering to the design, development, implement

你真的适合做软件开发吗

前段时间一个朋友跟我说,他说做软件开发不仅累,而且从来不跟人接触,整天要对着电脑研究代码.整个人都完全脱离社会了,自己都快变成代码了. 我笑着以一个过来人的身份对他说,你现在后悔了吧?!天下没有后悔的药,若想不后悔,就必须对将来要做的事情有个了解,这就好比商人投资某个项目一样,必须做好深入的考察后,才能进入,否则就凭着一腔热情,失败在所难免. 软件开发行业曾一度被各大媒体报渲染我21世纪的昭阳产业,人才缺口达到多少多少等等.听的大家是蠢蠢欲动,摩拳擦掌恨不得卯足劲冲进去好好干一番事业.然后各种媒