您的位置:首页 > 编程语言 > C#

IT公司笔试题算法部分(一)

2007-05-08 23:16 447 查看
[align=left]1、将一整数逆序后放入一数组中(要求递归实现)[/align]
[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]
[align=left]     char *str = "abcdedcba";[/align]
[align=left]     printf("%s: %s/n", str, find(str,[/align]
[align=left] strlen(str)) ? "Yes" : "No");[/align]
[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]
[align=left]{'X','o','X','X','o','o','o','X'},[/align]
[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]
[align=left]for(int j = 0; j < MAX_SIZE; j++)[/align]
[align=left]                  printf("%c%c", Maze[i][j], j < MAX_SIZE-1 ? ' ' : '/n');[/align]
[align=left]}else for(int k = 0; k < 4; k++) [/align]
[align=left]if(X >= 0 && Y >= 0 && Y < MAX_SIZE && X < MAX_SIZE && 'o' == Maze[X][Y]){[/align]
[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]}[/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]{[/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]
[align=left]Students[Tmp] = true;[/align]
[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]
[align=left]if(iRowNo == ROWS){ [/align]
[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]
[align=left]  }else if(Grid[iRowNo][iColNo]==0){ [/align]
[align=left]Grid[iRowNo][iColNo] = 1; [/align]
[align=left]iSumR[iRowNo]++; iSumC[iColNo]++;                                  if(iSumR[iRowNo]<iPointsR[iRowNo] && iSumC[iColNo]<=iPointsC[iColNo])[/align]
[align=left]                     Set(iRowNo);[/align]
[align=left]else if(iSumR[iRowNo]==iPointsR[iRowNo] && iRowNo < ROWS)[/align]
[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]
[align=left]return iFound;   // 用于判断是否有解[/align]
[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]
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 网格 string c# c