關(guān)于c++;筆試題,希望對(duì)你有所幫助!
#include
#include
#include
using namespace std;
//奶牛生子:一只幼年奶牛第4年可生下第一只奶牛 以后每年生一只
//現(xiàn)有一只幼年奶牛 20年后 共有多少只奶牛
int CowNum(int size)
{
int* year = new int[size];
memset(year, 0, size*sizeof(int));
year[0] = 1;
int count = 0;
for (int i = 0; i < size; ++i)
{
if (i >= 4-1 )
{
year[i] = year[i - 1] + year[i - 3];
}
}
for (int i = 0; i < size; ++i)
count += year[i];
return count;
delete year;
}
int CowNum1(int year)
{
int newCow1 = 1;//1歲 牛 開始有1只
int newCow2 = 0;//2歲 牛
int newCow3 = 0;//三歲 牛
int newCow4 = 0;//四歲 牛 成年牛
//int newCow5 = 0;//將題意理解成第5年牛開始生 則加個(gè)5歲牛數(shù)量
int oldCow = 0;//可生崽 牛
int count = 0; //總數(shù)
for (int yearcnt = 2; yearcnt <= year; ++yearcnt)//默認(rèn)牛是1歲 第一次進(jìn)去牛 2歲
{
//newCow5 = newCow4;
newCow4 = newCow3; //3歲牛長(zhǎng) 4歲
oldCow += newCow4;
newCow3 = newCow2;
newCow2 = newCow1;//一歲牛 長(zhǎng)2歲
newCow1 = oldCow;//1歲牛 為可生崽牛 的數(shù)量
count = oldCow + newCow1+newCow2+newCow3;//總數(shù)為 成年牛 + 1 2 3歲牛
//count = oldCow + newCow1 + newCow2 + newCow3+newCow4; //如果是5歲開始生
//總數(shù)為 成年牛 + 1 2 3 4歲牛
}
return count;
}
//一串珠子 有M<=10種顏色 n顆 求最小的含所有顏色的子串
//邏輯復(fù)雜的一道題
void AllColorBead(char* bead, int colorNum)//bead 珠子串 colorNum 顏色數(shù)
{
char* head,* str=bead; //head 最短子串頭 str 循環(huán)變量
int clrNum = 0 ,beadCnt=0,tmpCnt=1000000,tmpClrNum=-1;
char colorArr[128] = { 0 };//用來判斷每種顏色是否第一次出現(xiàn) 來區(qū)分顏色數(shù)是否+1
while (*str!=‘\0‘)
{
if (*(str + 1) != *str) //如果相連的顏色一樣直接跳過
{
char* tmp = str; //記錄str 如果該子串滿足要求 head=str
while ((*tmp)!=‘\0‘)
{
if (colorArr[*tmp] == 0)//顏色第一次出現(xiàn) clrNum++
{
++clrNum;
++colorArr[*tmp];
}
//if (clrNum == colorNum) //告訴珠子顏色數(shù)邏輯
//{
// if (tmpCnt > beadCnt)//如果該子串滿足要求 head = str 跳出循環(huán)
// {
// tmpCnt = beadCnt;
// head = str;
// }
// break;
//}
if (tmpClrNum==clrNum)//不告訴珠子顏色數(shù) 第一次需完全遍歷 求出顏色數(shù)
break;
++beadCnt;
++tmp;
}
if (tmpCnt > beadCnt&&clrNum>=tmpClrNum)//如果該子串滿足要求 head = str 跳出循環(huán)
{
tmpCnt = beadCnt;
tmpClrNum = clrNum;//不告訴珠子顏色數(shù)需加條件
head = str;
}
clrNum = 0; //每次檢索子串結(jié)束 計(jì)數(shù)器制零
beadCnt = 0;
memset(colorArr, 0, 128 * sizeof(char));
}
str++; //跳刀下一個(gè)子串
}
for (int i = 0; i <= tmpCnt; ++i)//輸出子串
cout << *(head + i);
cout << endl;
}
//n*n的 回字形 蛇形 數(shù)組 按行輸出
// eg: n=3
// 1 2 3
// 8 9 4
// 7 6 5
void SnakeArr(int n)
{
int* arr = new int[n*n]; //儲(chǔ)存數(shù)組
int type = 0;//寫入數(shù)組類型 0 從左向右 1 從上往下 2 從右往左 3從下往上
int num = 1;//輸入數(shù)組值 1---n*n
int gap = 0;//每行輸出跨度
int i = 0, j = 0;//數(shù)組下標(biāo)
while (num <= n*n)//num自加到n*n時(shí)說明 全填滿了 結(jié)束循環(huán)
{
if (type == 0)//從左向右 寫入數(shù)組
{
for (int index = i + gap; i < n - gap&&num <= n*n; ++i)
arr[i+j*n] = num++;
++type;//橫行寫入數(shù)組完成 類型+1 變豎行
++j;//j+1到下一行
}
if (type ==1)//從上到下
{
--i;//i退到 最外層處
for (int index = j + gap; j< n - gap&&num <= n*n; ++j)
arr[i + j*n] = num++;
++type;
--i; //i退到最外層-1處
}
if (type == 2)//從右到左
{
--j;//j退到未寫入最外層
for (int index = i - gap; i >= gap&&num <= n*n; --i)
arr[i + j*n] = num++;
++type;
++i;//i到左邊未遍歷最外層
}
if (type == 3)//從下道上
{
--j;//j退到未寫入最外層
for (int index = n - gap; j > gap&&num <= n*n; --j)
arr[i + j*n] = num++;
++j;//j退到未寫入最外層
++i;//i到左邊未遍歷最外層
type = 0;//寫入方向 類型 重新置1
}
gap++;//四個(gè)方向 都寫入完成 跨度+1
}
for (int index = 0; index < n*n; ++index)
cout << arr[index] << ‘ ‘;
cout << endl;
delete arr;
}
//在一個(gè)字符串中 刪除多余字符后 找到最長(zhǎng)的 回文字符串長(zhǎng)度
//eg:abbedbba 結(jié)果 abbebba
//邏輯龐大 十分復(fù)雜 網(wǎng)上好像有高端算法
int PlalindromeNum(char* str,int start,int end)
{
if (*str == 0)//判斷 指針有效性
return 0;
int count = 0;//當(dāng)前回文字符串的字符數(shù)
int bigCnt = 1;//最大回文字符串字符數(shù)
int right = end;//臨界值
while (start
{ //start 與end為當(dāng)前子串最兩端一對(duì)相同字符
for (int i = start + 1; i <=right; ++i)
{
if (str[i] == str[start])
{
end = i;
count = 2;//有相同項(xiàng) count為2
}
}
if (count != 2)//沒有相同項(xiàng) 跳到下個(gè)字符
++start;
}
if (end - start>2)//遞歸 找一對(duì)相同字符中的其他相同字符數(shù)量
count += PlalindromeNum(str, start + 1, end - 1);
else if (end - start == 2)//當(dāng)end-start相距為2 說明中間包含若干單獨(dú)字符 count++
{
++count;
}
if (right -end>1)//如果臨界值-end>1說明后面還有沒有遍歷的字符
{
if (bigCnt < count)//則將count 保存 置0
bigCnt = count;
count = 0;
count += PlalindromeNum(str, end+1 , right);//從子串開始繼續(xù)遞歸找匹配字符
}
if (bigCnt < count)
bigCnt = count;//始終保持bigCnt為最長(zhǎng)回文子串的字符數(shù)
return bigCnt;
}
////用遞歸實(shí)現(xiàn)n位的格雷碼 //至今未想明白
//
//char* Gray(int n)
//{
// char *arry = (char*)malloc(sizeof(char)*(int)pow(2, n)+1);
// if (n =1)
// {
// arry[0] = ‘0‘;
// arry[1] = ‘1‘;
// arry[2] =0 ;
// return arry ;
// }
//
// char * tmp=Gray(n - 1);
// int j = (int)pow(2, n) - 2;
// for (int i = 0;i
// {
// arry[i] = tmp[i] + 0;
// arry[j - 1 - i] = tmp[i] + 1;
// }
// return arry;
//}
//
//有一串珠子2種顏色(紅,藍(lán)),n個(gè)(n為奇數(shù)),有多少個(gè)藍(lán)珠子才能確定無論什么順序穿
//都能從不同位置的兩個(gè)藍(lán)珠子
//截?cái)酁?串,并得到一串?dāng)?shù)量為(n+1)/2(不包括這兩個(gè)藍(lán)色珠子)
//重在邏輯理解 代碼簡(jiǎn)單
void pearl_num(int n)
{
if (n < 3 || n % 2 != 1)
return;
int head = 0,end=0,count=0,num=2;
for (int i = 1; i
{
end = i;
if (end == (n + 1) / 2)
{
printf("%d\n", num);
return;
}
if ((end - head - 1) == (n + 1) / 2 || (n - 1 - end) == (n + 1) / 2)
{
i++;
}
else if (count > 0)
{
count--;
i++;
}
else
{
num++;
count=num-2;
i = 1;
}
}
printf("無答案!\n");
}
//數(shù)字的漢子讀法 0<=num<1000 例如 輸入 101 輸出yibailingyi
void test()
{
int num = 0;
char* a[12] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu", "shi", "bai" };
while (1)
{
int arr[3] = { 0 };
char* pinyin = ((char*)malloc(sizeof(char)*20));
scanf("%d", &num);
int tmp1 = num;
for (int i = 2; i >= 0; --i)
{
arr[i] = num % 10;
num /= 10;
}
char* tmp = pinyin;
for (int i = 0; i<3; ++i)
{
if (tmp1 == 0)
{
strcpy(pinyin, "ling\0");
pinyin += 4;
break;
}
if (i == 0)
{
if (arr[i] != 0)
{
strcpy(pinyin, a[arr[i]]);
pinyin += (int)strlen(a[arr[i]]);
strcpy(pinyin, a[11]);
pinyin += 3;
}
}
else if (i == 1)
{
if (arr[i] == 0)
{
if (arr[i - 1] == 0)
continue;
if (arr[i + 1] == 0)
break;
strcpy(pinyin, a[0]);
pinyin += 4;
}
else
{
strcpy(pinyin, a[arr[i]]);
pinyin += (int)strlen(a[arr[i]]);
strcpy(pinyin, a[10]);
pinyin += 3;
}
}
else
{
if (arr[i] != 0)
{
strcpy(pinyin, a[arr[i]]);
pinyin += (int)strlen(a[arr[i]]);
}
}
free(pinyin);
}
*pinyin = 0;
printf("%s\n", tmp);
pinyin = tmp;
}
}
//小明裝裝備按從左到右裝 如果物品太大 (大于背包最大容量)直接丟棄,如果背包裝不下
//換下個(gè)背包,前一個(gè)背包不再用,小明能裝多少物品?
//n 物品數(shù) t 背包負(fù)重 m 背包個(gè)數(shù)
//a[0]--a[n]被給物品質(zhì)量
//
void package()
{
int m, t ,n;
int a[20] = { 0 };
int i = 0;
scanf("%d%d%d",&n,&t,&m);
while (i < n)
{
scanf("%d", &a[i++]);
}
int count = 0, tmp = t;
for (i=0; m>0 && n > 0;)
{
if (a[i] > tmp)
{
i++;
n++;
}
else if (t-a[i]>=0)
{
t -= a[i++];
++count;
--n;
}
else if (m>1)
{
--m;
t = tmp;
t -= a[i++];
++count;
--n;
}
else
{
++i;
--n;
}
}
printf("%d\n",count);
}
//將字符串 按空格 翻轉(zhuǎn) 同時(shí) 將大小寫互換 例:“this Is a Str”-> "sTR A iS THIS"
//默認(rèn)給定字符串只含有字母與空格
void reverse_str_A(char * src)
{
char* str = (char*)malloc(sizeof(char)*(strlen(src)));//將給定字符串拷貝到可寫字符數(shù)組中
strcpy(str,src);
char* tmp = str;
int i = 0;
char* out = (char*)malloc(sizeof(char)*(strlen(str) ));//生成儲(chǔ)存處理后的字符數(shù)組
char* output = out;
while (*(tmp))//計(jì)算空格個(gè)數(shù)
{
if (*tmp++ == ‘ ‘&&*tmp!=0)//‘\0‘之前的不計(jì)算
++i;
}
int count = i;
int *a = (int *)malloc(sizeof(int)*i);//生成記錄空格下標(biāo)的數(shù)組
tmp = str;
i = 0;
int j = 0;
while (*tmp)//將空格下標(biāo)記錄并替換為‘\0‘方便拷貝
{
if (*tmp == ‘ ‘)//
{
*tmp = 0;
if (*(tmp + 1)== 0)//‘\0‘之前的空格直接處理 將輸出數(shù)組第一個(gè)字符替換為空格 并指向下一個(gè)
{
*output = ‘ ‘;
output++;
break;
}
a[j++] = i;
}
++tmp;
++i;
}
tmp = str;
for ( j = count-1; j>=0; --j)//將分割的字符串從后向前依次寫入輸出字符串并將各自\0替換為空格
{
if (a[0] == 0&&j==0)
break;
strcpy(output,tmp+a[j]+1);
output += strlen(tmp + a[j]+1);
*(output++) = ‘ ‘;
}
if (a[0] == 0)//處理開始空格
tmp++;
strcpy(output, tmp );//將首字符串拷貝到尾
output += strlen(tmp );
if (a[0] == 0)//將開始的空格移到末尾
{
output[0]= ‘ ‘;
output[1] = 0;
}
i = 0;
output = out;
while (*(output+i))//依次替換大小寫
{
if (*(output + i) >= ‘a‘&&*(output + i) <= ‘z‘)
*(output + i) -= 32;
else if (*(output + i) >= ‘A‘&&*(output + i) <= ‘Z‘)
*(output + i) += 32;
++i;
}
cout << out <<"***********"<< endl;//輸出
free(out);
free(output);
free(a);
}
int main()
{
cout<
cout << CowNum1(20) << endl;
AllColorBead("11231324566457711234567111", 7);
AllColorBead("asdccaacsdfdgfwererdfg",8);
SnakeArr(5);
char* a = "vvaabbcdcbbaaxaabbcdcbbaax";
cout << PlalindromeNum(a, 0, strlen(a)) << endl;
/*pearl_num(101);
package();*/
reverse_str_A(" This w W w Is str ");
/*test();*/
/*char * aa;
aa=Gray(10);
cout << aa << endl;*/
return 0;
}