数据结构复习回顾ppt1.introduction
1.数据结构 DR,是包括data 和relationship.两者整合在一起。
2.ADT abstract data type: 将数据类型的使用和它的表示(机内存储),实现(机内操作的实现)分隔开来。
把一个数据类型的表示以及在这个类型上的操作实现封装到一个程序模块,用户不必知道。
几道递归编程题:
1.写一个递归程序,返回给定N二进制表示中1的个数。
public int countOnes(int n) { if(n==0) { return 0; }else { return n%2 +countOnes(n/2); } }
2.给定字符进行全排列
// low和high标记进⾏行全排列的字⺟母的范围 public void permutation(char[] str , int low, int high) { if (low==high) { for (char c : str) cout << c; cout << endl; } else { for (int i=low; i<=high; i++) { swap(str, low, i); permutation(str, low+1, high); swap(str, low, i); } } } //str是引⽤用传递(passed by reference) void swap(char[] str, int i, int j) { char temp=str[i]; str[i]=str[j]; str[j]=temp; }
3.(1)求数组a中的最大整数。
(2)求n个整数的平均值。
需要考虑边界情况。
int getArrMax(int [] A, int n) { //n=A.length if(1==n) return A[0]; else { int temp = getArrMax(A, n-1); return (temp>A[n-1]) ? temp : A[n-1]; } } //
效率更高的:进行左右比较
int getArrMax(int [] A, int low, int high) { //low=0, high=A.length if(low==high) return A[low]; else { int x = getArrMax(A, low, (low+high)/2); int y = getArrMax(A, (low+high)/2+1, high); return (x>y) ? x : y; } }
2.求平均值:
static int getAvarge(int [] list,int n){ if(n==1){ return (double)list[0]; }else{ return double(getAvarge(list,n-1)*(double)(n-1)+list[n-1])/n } }
也可以先用递归求和再求平均值。
汉诺塔问题:
汉罗塔问题的描述:利用A,B,C三个,能够将n个数从A移动到C.
利用B这个中间塔,如果只有一个时,直接将A移动到C.
public class TowersOfHanoi { public static void main(String[ ] args) { System.out.printLn( “Enter number of disks” ); int n = MyInput.readInt( ); System.out.printLn( “The move are:”); moveDISKs(n, „A‟, „B‟, „C‟); } public static void moveDISKs(int n, char fromTower, char toTower, char auxTower) { if ( n= =1) System.out.printLn( “move disk “ + n + “from “+ fromTower +” to” + toTower); else { moveDISKs(n-1, fromTower, auxTower, toTower); System.out.printLn( “Move disk “ + n + “from “ + fromTower + “ to “ + toTower ); moveDISKs(n-1, auxTower, toTower, fromTower); } } }
4.对于各个修饰限定符的描述
1.public 在任何地方都可以访问。
2.private 只有在本类中可以访问。
3.protected 介于public 和private之间,只有子类或同包中进行访问。
4.默认的修饰符,就是不加任何,只能在同包中被访问。
Generic Objects in Java:
考虑两个函数:
1.
int Abc(int a,int b,int c) {return a+b+b*c+(a+b-c)/(a+b)+4; }
2.
float Abc(float a,float b,float c) {return a+b+b*c+(a+b-c)/(a+b)+4; }
可以观察知道,两个方法的区别仅仅在于a,b,c的数据类型不一样。
将两者集合成一个统一的类:Object.但是要注意的是类型的转换。2.要注意的是原始数据类型:boolean,short,char ,byte,int,long等并不是对象。
java input的两种方法:
1.
BufferedReader reader=new BufferedrReader(new InputStreamReader(System.in)); reader.readLine();
之后可以通过对readline的进行parseint等
如果一个line钟包含两个数:
str=new StringTokenizer(line); if(str.countTokens()!=2){ x=Integer.parseInt(str.nextToken);.. }
默认情况下tokens是被whitespace来分隔的。
其实也可以用split来自定义分隔。
文件读取和命令行读取。
题目4:递归计算一个链表的长度。
static int calLength(ListNode a){ if(a==NULL){ return 0; }else{ return 1+calLength(a.next); } } class ListNode{ Object content=Null; ListNode next=null; }
题目5:判断一个字符串是否是回文
既可以是一句话,也可以是单纯的一个单词。
public static boolean isPalindrome(String word, int low, int high) { if (low > high) return true; while (!Character.isLetter(word.charAt(low))) low++; while (!Character.isLetter(word.charAt(high))) high--; if (word.charAt(low) == word.charAt(high) || Math.abs(word.charAt(low) - word.charAt(high)) == 32) return isPalindrome(word, low+1, high-1); else return false; }
题目6:找出从自然数1,2..n中任取r个数的所有组合,编写一个递归算法。
# include <iostream> # include <vector> using namespace std; void combination(int n, int k, int start, vector<int> lst){ if(lst.size() == k){ for(int i = 0 ; i < k; i++){ cout<<lst[i]; } cout<<endl; return; } for(int i = start; i < n; i++){ lst.push_back(i + 1); combination(n, k, i + 1, lst); lst.erase(lst.end() - 1); } } int main(){ int n = 5; int k = 3; vector<int> lst; combination(n, k, 0, lst); return 0; }