您的位置:首页 > 其它

算法笔试题

2017-02-05 11:36 302 查看
1、将一整数逆序后放入一数组中(要求递归实现)
[align=left]void convert(int *result, int n)[/align]
[align=left]{[/align]
[align=left]     if(n>=10)[/align]
[align=left]         convert(result+1, n/10);[/align]
[align=left]     *result = n%10;   [/align]
[align=left]}[/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     int n = 123456789, result[20]={};[/align]
[align=left]     convert(result, n);[/align]
[align=left]     printf("%d:", n);[/align]
[align=left]     for(int i=0; i<9; i++)[/align]
[align=left]         printf("%d", result[i]);[/align]
[align=left]     return getchar();[/align]
}
2、求高于平均分的学生学号及成绩(学号和成绩人工输入)
[align=left]double find(int total, int n)[/align]
[align=left]{[/align]
[align=left]     int number, score, average;[/align]
[align=left]     scanf("%d", &number);[/align]
[align=left]     if(number != 0){[/align]
[align=left]         scanf("%d", &score);[/align]
[align=left]         average = find(total+score, n+1);[/align]
[align=left]         if(score >= average)[/align]
[align=left]              printf("%d:%d/n", number, score);[/align]
[align=left]         return average;[/align]
[align=left]     }else{[/align]
[align=left]         printf("Average=%d/n", total/n);[/align]
[align=left]         return total/n;[/align]
[align=left]     }[/align]
[align=left]}[/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     find(0, 0);[/align]
[align=left]     return getchar();[/align]
}
3、递归实现回文判断(如:abcdedbca就是回文)
[align=left]int find(char *str, int n)[/align]
[align=left]{[/align]
[align=left]     if(n<=1) return 1;[/align]
[align=left]     else if(str[0]==str[n-1])   return find(str+1, n-2);[/align]
[align=left]     else     return 0;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
     char *str = "abcdedcba";
[align=left]     printf("%s: %s/n", str, find(str,[/align]

 strlen(str)) ? "Yes" : "No");
[align=left]     return getchar();[/align]
}
 
4、组合问题(从M个不同字符中任取N个字符的所有组合)
[align=left]void find(char *source, char *result, int n)[/align]
[align=left]{[/align]
[align=left]     if(n==1){[/align]
[align=left]         while(*source)[/align]
[align=left]            printf("%s%c/n", result, *source++);[/align]
[align=left]     }else{[/align]
[align=left]         int i, j;[/align]
[align=left]         for(i=0; source[i] != 0; i++);[/align]
[align=left]         for(j=0; result[j] != 0; j++);[/align]
[align=left]         for(; i>=n; i--)[/align]
[align=left]         {[/align]
[align=left]              result[j] = *source++;[/align]
[align=left]              result[j+1] = '/0';[/align]
[align=left]              find(source, result, n-1);[/align]
[align=left]         }[/align]
[align=left]     }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     int const n = 3;[/align]
[align=left]     char *source = "ABCDE", result[n+1] = {0};[/align]
[align=left]     if(n>0 && strlen(source)>0 && n<=strlen(source))[/align]
[align=left]         find(source, result, 3);[/align]
[align=left]     return getchar();[/align]
}
5、分解成质因数(如435234=251*17*17*3*2)
[align=left]void prim(int m, int n)[/align]
[align=left]{[/align]
[align=left]     if(m>n){[/align]
[align=left]         while(m%n != 0) n++;[/align]
[align=left]         m /= n;[/align]
[align=left]         prim(m, n);[/align]
[align=left]         printf("%d*", n);[/align]
[align=left]     }[/align]
[align=left]}[/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     int n = 435234;[/align]
[align=left]     printf("%d=", n);[/align]
[align=left]     prim(n, 2);[/align]
[align=left]     return getchar();[/align]
}
 
6、寻找迷宫的一条出路(o:通路; X障碍)
[align=left]#define MAX_SIZE 8[/align]
[align=left]int H[4] = {0, 1, 0, -1};[/align]
[align=left]int V[4] = {-1, 0, 1, 0};          [/align]
[align=left]char Maze[MAX_SIZE][MAX_SIZE] = {{'X','X','X','X','X','X','X','X'},[/align]
[align=left]                                 {'o','o','o','o','o','X','X','X'},[/align]
[align=left]                                 {'X','o','X','X','o','o','o','X'},[/align]
[align=left]                                 {'X','o','X','X','o','X','X','o'},[/align]
[align=left]                                 {'X','o','X','X','X','X','X','X'},[/align]

{'X','o','X','X','o','o','o','X'},
[align=left]                                {'X','o','o','o','o','X','o','o'},[/align]
[align=left]                                 {'X','X','X','X','X','X','X','X'}};[/align]
[align=left]void FindPath(int X, int Y)[/align]
[align=left]{[/align]
[align=left]    if(X == MAX_SIZE || Y == MAX_SIZE){[/align]
[align=left]         for(int i = 0; i < MAX_SIZE; i++)[/align]

for(int j = 0; j < MAX_SIZE; j++)

                  printf("%c%c", Maze[i][j], j < MAX_SIZE-1 ? ' ' : '/n');

}else for(int k = 0; k < 4; k++)

if(X >= 0 && Y >= 0 && Y < MAX_SIZE && X < MAX_SIZE && 'o' == Maze[X][Y]){
[align=left]                  Maze[X][Y] = ' ';[/align]
[align=left]                  FindPath(X+V[k], Y+H[k]);[/align]
[align=left]                  Maze[X][Y] ='o';[/align]

}
[align=left]}[/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]    FindPath(1,0);[/align]
[align=left]    return getchar();[/align]
}
 
[align=left]7、随机分配座位,共50个学生,使学号相邻的同学座位不能相邻(早些时候用C#写的,没有用C改写)。[/align]
[align=left]static void Main(string[] args)[/align]
[align=left]{[/align]
[align=left]     int Tmp = 0, Count = 50;            [/align]
[align=left]     int[] Seats = new int[Count];            [/align]
[align=left]     bool[] Students = new bool[Count];[/align]
[align=left]     System.Random RandStudent=new System.Random();[/align]
[align=left]     Students[Seats[0]=RandStudent.Next(0,Count)]=true;[/align]
[align=left]     for(int i = 1; i < Count; )[/align]

{
[align=left]         Tmp=(int)RandStudent.Next(0,Count);[/align]
[align=left]         if((!Students[Tmp])&&(Seats[i-1]-Tmp!=1) && (Seats[i-1] - Tmp) != -1){[/align]
[align=left]              Seats[i++] = Tmp;[/align]

Students[Tmp] = true;
[align=left]         }[/align]
[align=left]     }[/align]
[align=left]     foreach(int Student in Seats)[/align]
[align=left]         System.Console.Write(Student + " ");[/align]
[align=left]     System.Console.Read();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]8、求网格中的黑点分布(有6*7的网格,在某些格子中有黑点,已知各行与各列中有黑点的点数之和)[/align]
[align=left]#define ROWS 6[/align]
[align=left]#define COLS 7[/align]
[align=left]int iPointsR[ROWS] = {2, 0, 4, 3, 4, 0};           // 各行黑点数和的情况[/align]
[align=left]int iPointsC[COLS] = {4, 1, 2, 2, 1, 2, 1};        // 各列黑点数和的情况[/align]
[align=left]int iCount, iFound;[/align]
[align=left]int iSumR[ROWS], iSumC[COLS], Grid[ROWS][COLS];[/align]
[align=left] [/align]
[align=left]int Set(int iRowNo)[/align]
[align=left]{[/align]

if(iRowNo == ROWS){
[align=left]        for(int iColNo=0; iColNo < COLS && iSumC[iColNo]==iPointsC[iColNo]; iColNo++)[/align]
[align=left]           if(iColNo == COLS-1){[/align]
[align=left]               printf("/nNo.%d:/n", ++iCount);[/align]
[align=left]               for(int i=0; i < ROWS; i++)[/align]
[align=left]                  for(int j=0; j < COLS; j++)[/align]
[align=left]                      printf("%d%c", Grid[i][j], (j+1) % COLS ? ' ' : '/n');[/align]
[align=left]               iFound = 1;                        // iFound = 1,有解[/align]
[align=left]           }[/align]
[align=left]    }else{[/align]
[align=left]        for(int iColNo=0; iColNo < COLS; iColNo++)[/align]
[align=left]        {[/align]
[align=left]            if(iPointsR[iRowNo] == 0){[/align]
[align=left]                Set(iRowNo + 1);[/align]

  }else if(Grid[iRowNo][iColNo]==0){

Grid[iRowNo][iColNo] = 1;

iSumR[iRowNo]++; iSumC[iColNo]++;                                  if(iSumR[iRowNo]<iPointsR[iRowNo] && iSumC[iColNo]<=iPointsC[iColNo])
[align=left]                     Set(iRowNo);[/align]

else if(iSumR[iRowNo]==iPointsR[iRowNo] && iRowNo < ROWS)
[align=left]                     Set(iRowNo + 1);[/align]
[align=left]                Grid[iRowNo][iColNo] = 0;[/align]
[align=left]                iSumR[iRowNo]--; iSumC[iColNo]--;[/align]
[align=left]            }[/align]
[align=left]        }[/align]
[align=left]    }[/align]

return iFound;   // 用于判断是否有解
[align=left]}[/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]    if(!Set(0))[/align]
[align=left]        printf("Failure!");[/align]
[align=left]    return getchar();[/align]
[align=left]}[/align]

[align=left]9、有4种面值(面值为1, 4, 12, 21)的邮票很多枚,从中最多任取5张进行组合,求邮票最大连续组合值[/align]
[align=left]#define N 5[/align]
[align=left]#define M 5[/align]
int k, Found, Flag
;
[align=left]int Stamp[M] = {0, 1, 4, 12, 21};[/align]
[align=left] [/align]
[align=left]// 在剩余张数n中组合出面值和Value[/align]
[align=left]int Combine(int n, int Value)[/align]
[align=left]{[/align]
[align=left]     if(n >= 0 && Value == 0){[/align]
[align=left]         Found = 1;[/align]
[align=left]         int Sum = 0;[/align]
[align=left]         for(int i=0; i<N && Flag[i] != 0; i++){[/align]
[align=left]              Sum += Stamp[Flag[i]];[/align]
[align=left]              printf("%d ", Stamp[Flag[i]]);[/align]
[align=left]         }[/align]
[align=left]         printf("/tSum=%d/n/n", Sum);[/align]
[align=left]     }else for(int i=1; i<M && !Found && n>0; i++)[/align]
[align=left]         if(Value-Stamp[i] >= 0){[/align]
[align=left]              Flag[k++] = i;[/align]
[align=left]              Combine(n-1, Value-Stamp[i]);[/align]
[align=left]              Flag[--k] = 0;[/align]
[align=left]         }[/align]
[align=left]     return Found;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     for(int i=1; Combine(N, i); i++, Found=0);[/align]
[align=left]     return getchar();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]10、大整数数相乘的问题。[/align]
[align=left]void Multiple(char A[], char B[], char C[])[/align]
[align=left]{[/align]
[align=left]    int TMP, In=0, LenA=-1, LenB=-1;[/align]
[align=left]    while(A[++LenA] != '/0');[/align]
[align=left]    while(B[++LenB] != '/0');[/align]
[align=left]    int Index, Start = LenA + LenB - 1;[/align]
[align=left]    for(int i=LenB-1; i>=0; i--)[/align]
[align=left]    {[/align]
[align=left]        Index = Start--;[/align]
[align=left]        if(B[i] != '0'){[/align]
[align=left]            for(int In=0, j=LenA-1; j>=0; j--)[/align]
[align=left]            {[/align]
[align=left]                TMP = (C[Index]-'0') + (A[j]-'0') * (B[i] - '0') + In;[/align]
[align=left]                C[Index--] = TMP % 10 + '0';[/align]
[align=left]                In = TMP / 10;[/align]
[align=left]            }[/align]
[align=left]            C[Index] = In + '0';[/align]
[align=left]        }[/align]
[align=left]    }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]    char A[] = "21839244444444448880088888889";[/align]
[align=left]    char B[] = "38888888888899999999999999988";[/align]
[align=left]char C[sizeof(A) + sizeof(B) - 1];[/align]
[align=left] [/align]
[align=left]    for(int k=0; k<sizeof(C); k++)[/align]
[align=left]        C[k] = '0';[/align]
[align=left]    C[sizeof(C)-1] = '/0';[/align]
[align=left] [/align]
[align=left]    Multiple(A, B, C);[/align]
[align=left]    for(int i=0; C[i] != '/0'; i++)[/align]
[align=left]        printf("%c", C[i]);[/align]
[align=left]    return getchar();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]11、求最大连续递增数字串(如“ads3sl456789DF3456ld345AA”中的“456789”)[/align]
[align=left]int GetSubString(char *strSource, char *strResult)[/align]
[align=left]{[/align]
[align=left]    int iTmp=0, iHead=0, iMax=0;[/align]

    for(int Index=0, iLen=0; strSource[Index]; Index++)
[align=left]    {[/align]
[align=left]        if(strSource[Index] >= '0' && strSource[Index] <= '9'[/align]
[align=left]&& strSource[Index-1] > '0' && strSource[Index] == strSource[Index-1]+1)[/align]
[align=left]{[/align]
[align=left]            iLen++;                    // 连续数字的长度增1[/align]
[align=left]        }else{                          // 出现字符或不连续数字[/align]
[align=left]            if(iLen > iMax)[/align]
[align=left]            {[/align]

            iMax = iLen;
[align=left]iHead = iTmp;[/align]
[align=left]            }       [/align]
[align=left]           [/align]
[align=left]            // 该字符是数字,但数字不连续[/align]
[align=left]            if(strSource[Index] >= '0' && strSource[Index] <= '9'){[/align]

                iTmp = Index;
[align=left]iLen = 1;[/align]
[align=left]            }[/align]
[align=left]        }   [/align]
[align=left]    }[/align]
[align=left]       [/align]
[align=left]    for(iTmp=0 ; iTmp < iMax; iTmp++) // 将原字符串中最长的连续数字串赋值给结果串[/align]
[align=left]        strResult[iTmp] = strSource[iHead++];[/align]
[align=left]    strResult[iTmp]='/0';[/align]
[align=left]    return iMax;                      // 返回连续数字的最大长度[/align]
[align=left]}[/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]

    char strSource[]="ads3sl456789DF3456ld345AA", char strResult[sizeof(strSource)];
[align=left]printf("Len=%d, strResult=%s /nstrSource=%s/n", GetSubString(strSource, strResult),[/align]
[align=left]strResult, strSource);[/align]
[align=left]    return getchar();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]12、四个工人,四个任务,每个人做不同的任务需要的时间不同,求任务分配的最优方案。(2005年5月29日全国计算机软件资格水平考试——软件设计师的算法题)。[/align]
[align=left]#include "stdafx.h"[/align]
[align=left]#define N 4[/align]
int Cost

= { {2, 12, 5, 32},       // 行号:任务序号,列号:工人序号
[align=left]                    {8, 15, 7, 11},       // 每行元素值表示这个任务由不同工人完成所需要的时间[/align]
[align=left]                    {24, 18, 9, 6},[/align]
[align=left]                    {21, 1, 8, 28}};[/align]
[align=left]int MinCost=1000;[/align]
int Task
, TempTask
, Worker
;
[align=left]void Assign(int k, int cost)[/align]
[align=left]{[/align]
[align=left]     if(k==N)[/align]
[align=left]     {[/align]
[align=left]         MinCost = cost;   [/align]
[align=left]         for(int i=0; i<N; i++)[/align]
[align=left]              TempTask[i] = Task[i];[/align]
[align=left]     }else{[/align]
[align=left]         for(int i=0; i<N; i++){[/align]
[align=left]              if(Worker[i]==0 && cost+Cost[k][i] < MinCost)[/align]
[align=left]              {[/align]
[align=left]                   Worker[i] = 1;     Task[k] = i;[/align]
[align=left]                   Assign(k+1, cost+Cost[k][i]);[/align]
[align=left]                   Worker[i] = 0; Task[k] = 0;[/align]
[align=left]              }[/align]
[align=left]         }[/align]
[align=left]     }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     Assign(0, 0);[/align]
[align=left]     printf("最佳方案总费用=%d/n", MinCost);[/align]
[align=left]     for(int i=0; i<N; i++)      /* 输出最佳方案 */[/align]
[align=left]         printf("/t任务%d由工人%d来做:%d/n", i, TempTask[i], Cost[i][TempTask[i]]);[/align]
[align=left]     return getchar();     [/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]13、八皇后问题(输出所有情况,不过有些结果只是旋转了90度而已)。哈哈:)回溯算法的典型例题[/align]
[align=left]#define N 8[/align]
int Board

;
[align=left]int Valid(int i, int j)     // 所下棋子有效性的严正[/align]
[align=left]{[/align]
[align=left]     int k = 1;[/align]
[align=left]     for(k=1; i>=k && j>=k;k++)[/align]
[align=left]         if(Board[i-k][j-k])    return 0;[/align]
[align=left]     for(k=1; i>=k;k++)[/align]
[align=left]         if(Board[i-k][j])      return 0;[/align]
[align=left]     for(k=1; i>=k && j+k<N;k++)[/align]
[align=left]         if(Board[i-k][j+k])    return 0;[/align]
[align=left]     return 1;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]void Trial(int i, int n)[/align]
[align=left]{[/align]
[align=left]     if(i==n){[/align]
[align=left]          for(int k=0; k<n; k++){[/align]
[align=left]              for(int m=0; m<n; m++)[/align]
[align=left]                   printf("%d ", Board[k][m]);[/align]
[align=left]              printf("/n");[/align]
[align=left]         }[/align]
[align=left]         printf("/n");[/align]
[align=left]     }else{[/align]
[align=left]         for(int j=0; j<n; j++){[/align]
[align=left]              Board[i][j] = 1;[/align]
[align=left]              if(Valid(i,j))[/align]
[align=left]                   Trial(i+1, n);[/align]
[align=left]              Board[i][j] = 0;[/align]
[align=left]         }[/align]
[align=left]     }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     Trial(0, N);[/align]
[align=left]     return getchar();[/align]
[align=left]}[/align]
[align=left]14、实现strstr功能(寻找子串在父串中首次出现的位置)[/align]
[align=left]char * strstring(char *ParentString, char *SubString)[/align]
[align=left]{[/align]
[align=left]     char *pSubString, *pPareString;[/align]
[align=left]     for(char *pTmp=ParentString; *pTmp; pTmp++)[/align]
[align=left]     {[/align]
[align=left]         pSubString = SubString;[/align]
[align=left]         pPareString = pTmp;   [/align]
[align=left]         while(*pSubString == *pPareString && *pSubString != '/0')[/align]
[align=left]         {[/align]
[align=left]              pSubString++;[/align]
[align=left]              pPareString++;[/align]
[align=left]         }[/align]
[align=left]         if(*pSubString == '/0')     return pTmp;[/align]
[align=left]     }[/align]
[align=left]     return NULL;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     char *ParentString = "happy birthday to you!";[/align]
[align=left]     char *SubString = "birthday";[/align]
[align=left]     printf("%s",strstring(ParentString, SubString));[/align]
[align=left]     return getchar();[/align]
[align=left]}}[/align]

 

1,写出一个函数,比较两个字符串,返回最大公串,例如abacdaccbadc和cedaccbe返回daccb;

2,有100个数字,其中有正数也有负数,找出连续三个相加之和最大部分;

要求:尽量不要使用库函数!

两道一起来:支持搜索中文,

import java.util.Random;

public class Test

{

  private static int maxSubStart = 0;

  private static int maxSubLength = 0;

  private static char[] c1, c2;

  private static boolean isSame(int i, int j)

  {

    return c1[i] == c2[j];

  }

  private static void setMaxSub(int start1, int start2)

  {

    int i = start1, j = start2;

    int maxStart = 0;

    int maxLength = 0;

    for (; i < c1.length && j < c2.length; i++,j++)

    {

      if (isSame(i, j))

      {

        maxLength++;

      }

      else

        break;

    }

    if (maxLength > maxSubLength)

    {

      maxSubLength = maxLength;

      maxSubStart  = start1;

    }

  }

  private static String getMaxCommonString(String s1, String s2)

  {

    c1 = s1.toCharArray();

    c2 = s2.toCharArray();

    if (c1.length > c2.length)  // swap s1, s2 so s1.length < s2.length

    {

      char[] c = c1;

      c1 = c2;

      c2 = c;

    }

    int minLength = c1.length;

    int maxLength = c2.length;

    for (int i = 0; i < minLength; i++)

    {

      char ch = c1[i];

      for (int j = 0; j < maxLength; j++)

      {

        if (ch == c2[j])

        {

          setMaxSub(i, j);

        }

      }

    }

    return new String(c1, maxSubStart, maxSubLength);

  }

  private static int[] getRandomInt(int length)

  {

    Random r = new Random();

    int[] res = new int[length];

    for (int i = 0; i < length; i++)

    {

      res[i] = r.nextInt(200) - 100;

    }

    return res;

  }

  private static int count(int[] num, int i)

  {

    return num[i]+num[i+1]+num[i+2];

  }

  private static int getMaxThreeStart(int[] num)

  {

    int end = num.length - 3;

    int max = 0;

    int start = 0;

    for (int i = 0; i < end; i++)

    {

      int c = count(num, i);

      if (c > max)

      {

        max = c;

        start = i;

      }

    }

    return start;

  }

  public static void main(String[] args)

  {

    //abacdaccbadc和cedaccbe

    String s1 = "abacd测试汉字 accbadc", s2 = "ced测试汉字 accbe";

    System.out.println(s1 + "   " + s2 + " 的最大公串为: " + getMaxCommonString(s1, s2));

    int[] num = getRandomInt(100);

    int start = getMaxThreeStart(num);

    for (int i = 0; i < 100; i++)

    {

      System.out.print(num[i] + "  ");

      if (i%10 == 9)

      {

        System.out.println();

      }

    }

    System.out.println("三个连续数字之和最大的三个数子为: " + num[start] + "  " + num[start+1] + "  " + num[start+2]);

  }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  递归 算法题目