编程小练习(4)

修改字符串

给定一个字符串,当其中出现连续三个相同的小写字母时,将其变为这个字母的下一个字母,如果是z,则变为a,如 "aaac" 变为 “bc”。变换后,如果又出现了连续三个相同的小写字母,则继续变换。最终的输出的字符不含有连续三个相等的小写字母。

#include <stdlib.h>
#include <string.h>
#include <iostream>

int ChangeString(char *pInStr, char *pOutStr)
{
	if (pInStr == 0 || pOutStr == 0) return -1;
	bool flag = true;
	char input[256];
	strcpy(input, pInStr);
	char *output = pOutStr;

	int len, i;
	while (flag) {
		len = (int) strlen(input);
		for (i = 0; i < len; ++i) {
			if (input[i] >= 'a' && input[i] <= 'z' && i <= len - 3) {
				if (input[i] == input[i + 1] && input[i] == input[i + 2]) break;
			}
		}
		if (i == len) flag = false;

		for (i = 0; i <= len;) {
			if (input[i] >= 'a' && input[i] <= 'z' && i <= len - 3) {
				if (input[i] == input[i + 1] && input[i] == input[i + 2]) {
					*output = input[i] + 1;
					if (*output == 'z' + 1) *output = 'a';
					++output;
					i += 3;
					continue;
				}
			}
			*output++ = input[i++];
		}
		*output = '\0';

		memset(input, 0, 256);
		strcpy(input, pOutStr);
		if (!flag) break;
		output = pOutStr;
		memset(output, 0, len);
	}
	return 0;
}

int main() 
{
	char *pIn = "jkds*^*(HKEEEklIdddjilzzzzzzabb";
	char pTest[200];
	ChangeString(pIn, pTest);
	std::cout<< pTest ;  // jkds*^*(HKEEEklIejilc
}

找出字符串中第一个出现次数最多的字符

找出给定字符串中第一个出现次数最多的字符。

#include <map>
bool FindChar(char* pInputString, char* pChar)
{
	if(pInputString == 0 || pChar == 0) 
		return false;

	std::map<char,int> m;
	char *p = pInputString;
	while(*p) m[*p++] = 0;

	p = pInputString;
	while(*p) m[*p++]++;

	p = pInputString;
	*pChar = *pInputString;
	while(*p) {
		if(m[*p] > m[*pChar]) *pChar = *p;
		++p;
	}
	return true;
}

整数反序

将一个整数反序,并按照指定格式输出。如-123,输出"-1 2 3"。

#include <stdlib.h>
#include <vector>

int ProcessX(int iInput, int& iNum, char * strRst, int& iOutput)
{
	if(iInput > 99999 || iInput < -99999 || strRst == 0)
		return -1;

	if(iInput == 0){
		iNum = 1;
		*strRst++ = '0';
		*strRst = '\0';
		iOutput = 0;
		return 0;
	}

	std::vector<int> ve;
	bool isNegative = false;
	if(iInput < 0) {
		isNegative = true;
		iInput *= -1;
	}
	while(iInput != 0){
		ve.push_back( iInput % 10 );
		iInput /= 10;
	}

	iNum = (int)ve.size();
	iOutput = 0;
	for(unsigned int i = 0; i < ve.size(); ++i){
		iOutput = iOutput*10 + ve[i];
	}

	if(isNegative) {
		iOutput *= -1;
		*strRst++ = '-';
	}
	for(int i = (int)ve.size()-1; i >= 0; --i){
		*strRst++ = ve[i] + '0';
		*strRst++ = ' ';
	}
	*(--strRst) = '\0';
	return 0;
}

字符串替换

字符串替换,注意成功返回值。

int ProcessString( char * strInput,char chSrc,char chDes ,char * strOutput)
{
	if(strInput == 0 || strOutput == 0) return -1;
	bool flag = false;
	while(*strInput){
		if(*strInput == chSrc){
			flag = true;
			*strOutput++ = chDes;
			strInput++;
			continue;
		}
		*strOutput++ = *strInput++;
	}
	*strOutput = '\0';
	if(flag) return 0;
	return -1;
}

找出升序数组中和为给定值的两个数字

给定一个升序数组,找出相加等于特定值的两个数字,任意两个即可。

bool FindTwoNumbersWithSum(int aData[], unsigned int uiLength, int sum, int *pNum1, int *pNum2)
{
	if( aData == 0) return false;

	unsigned i,j;
	i = 0;
	j = uiLength - 1;
	int cal = 0;
	while(i < j){
		cal = aData[i] + aData[j];
		if(cal > sum) --j;
		if(cal < sum) ++i;
		if (cal == sum){
			*pNum1 = aData[i];
			*pNum2 = aData[j];
			return true;
		}
	}
	return false;
}

判断两台计算机IP地址是同一子网络

IP 和掩码的格式为这样的一个字符串,如:“192.168.0.254”;如属于,返回1,否则返回 0. 

int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask)
{
	int ip1[4], ip2[4], ipm[4];
	sscanf_s(pcIp1, "%d.%d.%d.%d", &ip1[0], &ip1[1], &ip1[2], &ip1[3]);
	sscanf_s(pcIp2, "%d.%d.%d.%d", &ip2[0], &ip2[1], &ip2[2], &ip2[3]);
	sscanf_s(pcSubNetworkMask, "%d.%d.%d.%d", &ipm[0], &ipm[1], &ipm[2], &ipm[3]);

	for(int i = 0; i < 4; ++i){
		if((ip1[i] & ipm[i]) != (ip2[i] & ipm[i]))
			return 0;
	}
	return 1;
}

最大递减数

求一个 int 数中包含的最大连续递减数,负数返回 -1。

#include <stdio.h>
#include <string.h>

int getMaxDegressiveNum (int num)
{
	if(num<0) return -1;
	char c[12];
	sprintf_s(c, "%d", num);  
    int max = c[0] - '0', tmp = c[0] - '0';
    for(unsigned int i = 1; i < strlen(c); ++i) {
        if (c[i] < c[i-1])
            tmp = tmp * 10 + (c[i] - '0');
        else
            tmp = c[i] - '0';
		max = tmp > max ? tmp : max;
    }
    return max;	
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值