问题源于在大二的数据结构老师交流的一个经典问题,在大学即将毕业之际,将大学中碰到一些问题,和自己的思考供大家参考
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
算法分析:一个简单递归函数
我们在利用计算机求汉诺塔问题时,必不可少的一步是对整个实现求解进行算法分析。到目前为止,求解汉诺塔问题最简单的算法还是同过递归来求,至于是什么是递归,递归实现的机制是什么,我们说的简单点就是自己是一个方法或者说是函数,但是在自己这个函数里有调用自己这个函数的语句,而这个调用怎么才能调用结束呢?,这里还必须有一个结束点,或者具体的说是在调用到某一次后函数能返回一个确定的值,接着倒数第二个就能返回一个确定的值,一直到第一次调用的这个函数能返回一个确定的值。
源码
// 汉诺塔问题.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
void move(int n,char x,char y){
printf("%d:%c--%c\n",n,x,y);
}
void Hanoi(int n,char x,char y,char z){
if(n==1){
move(n,x,z);
}else{
Hanoi(n-1,x,z,y);
move(n,x,z);
Hanoi(n-1,y,x,z);
}
}
int main(int argc, char *argv[]) {
Hanoi(3,'A','B','C');
return 0;
}
程序结果
最长数组子串
问题描述:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
求最长数组子串:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* longest_common_substring(char *str1,char *str2)
{
int str1len = strlen(str1);
int str2len = strlen(str2);
int i,j,index,max=0,num=0;
int start;
//将两个字符串看做两个直尺,固定一个直尺,另外一个从头到尾开始移动,逐一与固定的直尺比较值。
for(i = 0; i < str1len; i++)
{
for(j = 0; j < str2len; j++)
{
//这里的start1、start2是比较关键的
int start1=i;
int start2=j;
while((start1 <= str1len-1) && (start2 <= str2len-1) && (str1[start1++] == str2[start2++]))
num++;
if(num > max)//如果num是当前最大匹配的个数,则赋给max,并且在start记下str1最长匹配开始的位置
{
max=num;
start=i;
}
num=0;//如果num不是当前最大的,则赋为0值继续循环
}
}
char *str=(char *)malloc(max + 1);
strncpy(str,str1 + start,max);//从字符串str1的start位置开始,拷贝max个字符到str中,这就是我们找出的最大子串
str[max] = '\0';
printf("最长公共连续子串的长度为:%d\n",max);
return str;
}
程序结果
总结:检查函数的指针、变量和边界值是否出错;逻辑是否正常,自定义的函数与main函数之间的引用和联系,和形参和实参的差别。按照函数使用在头脑计算几遍,是否有逻辑上的错误。