算法笔试题
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]);
}
};
[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]);
}
};
相关文章推荐
- 笔试面试算法经典--最长连续序列
- 基础算法笔试题:小孩数数问题(数三退一)
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 常见算法笔试或面试题
- 算法整理——2015腾讯开发岗笔试题
- 笔试算法题(42):线段树(区间树,Interval Tree)
- 技术笔试-编程之法(算法面试心得)
- java面试中常遇到的算法笔试题
- 笔试算法题(47):简介 - B树 & B+树 & B*树
- 算法————笔试内容-->链表(一)
- 算法————笔试内容--->链表(二)
- 【算法】各大公司的笔试之单链表
- 笔试面试算法经典--最长回文子串
- 【面试笔试算法】牛客网一站通Offer编程题2016.4.19
- 滴滴出行2017秋招算法笔试题(作弊概率)
- 黑马程序员--舍友笔试中的一道算法题
- 网易内推笔试算法题目(1)
- 阿里巴巴2013实习生笔试题精选2道算法题
- 一著名软件公司的java笔试算法题的答案
- 笔试算法学习--链表相关