数据结构及实现

数组

  • 数组类型的兼容性 如何处理集合类型的继承?Person []arr=new Empolyee[5];//arrays是compatible类型的,arr[0]=new Student(…);//student 是person类型的。系统运行时(jvm)不抛出ClassCastException。避免这些问题的方法是:指定这些数组不是类型兼容的。但在java中数组是类型兼容的,这就叫做协变数组类型。如果将一个类型不兼容的对象插入到数组中,抛出ArrayStoreException。(在编译时抛出异常,而不在运行时抛出类型转换异常)

泛型类、泛型接口

  • 在泛型类声明内部,可以声明泛型类型的域和使用泛型类型作为参数或返回类型的方法。在java中,eg:自动装箱Integer、自动拆箱intValue

菱形运算符

-Student s =new Student<>();传入的对象必须是INteger类型的,其他则报错。

通配符

  • 表示类型参数类型的子类。public static double totalArea(Collection<?extends Shape>arr){***}或用超类表示super Shape.

类型界限

-public static <Textends Comparble<? super T> T findMax(T[]arr){***}

  • 法则3:O(N)=logkN,说明对数增长非常缓慢。

  • 一层for()循环占用O(N)运行时间。2层for循环O(N2)。
    //后序遍历

public int size(){
    int totalSize = sizeOfThisFile();
    if(isDirector()){
        for(Child:c child){totalSize+=size();
        }
    return totalSize;
    }
}
  • 二叉树实现
class BinaryNode{
 Object elecment;  //节点
 BinaryNode left;  //左儿子
  BinaryNode right;  //右儿子
}
  • 二叉查找树的实现
private static class BinaryNode<T>{
    T ele; //节点
        BinaryNode<T> left;//左节点
    BinaryNode<T> right;//右节点
 //构造
    BinaryNode(T ele){
     this(ele,null,null);
   }
  BinaryNode(T ele, BinaryNode<T> lt,BinaryNode<T> rt){
      lele=ele;
      left = lt;
     right = rt;
   }
}
  • 二叉查找树contains操作
private boolean  contains(T x,BinaryNode<T> t){
  if(t==null){return false;}
    int  compareResult =x.compareTo(t.ele);
  if( compareResult<0){
  return  contains(x,t.left);
 }else if( compareResult>0){
   return  contains(x,t.right);
}else{
  return  true;
}
}
  • 二叉查找树查找最小、最大值(非递归实现)
//查找最小值
private  BinaryNode<T> findMin( BinaryNode<T> t){
    if(t==null){
    return null;
        }else if(t.left==null){return t;}
    return findMin(t.left);
}
//查找最大值
private  BinaryNode<T> findMax( BinaryNode<T> t){
    if(t!=null){
    while(t.right!=null){
    t=t.right;
    }
    return t;
}

需求:通过一个字母的替换,可以变成至少15个以上其他单词的单词。假定一个字典有89000个不同长度的不同单词组成,单词有1-3个字母的,4-10个字母的,11一个字母以上的组成。其中:1个字母有..个,2个字母有…个,3个字母有…个,以此类推。
分析:使用Map集合,其中关键字是单词,而关键字的值是1字母替换得到的一列单词。得到的项的集合使用for循环遍历,得到键是一个单词,值是一列单词的序偶。eg:

//从50000个单词组成的数组构造Map对象
public  static void printHighChangeable(Map<String,List<String>> adjWord,int minWords){
for(Map.Entry<String,List<String>> entry: adjWord.entrySet())
  list<String> words = entry.getValue();
  if(words.size()>=minWords){
   syso(entry.getKey()+"(");
syso(words.size()+"):");
for(String w:words){
    syso(""+w);
    sysoln();
  }
  }
}

//需求:测试除一个字母替换外,两个字母是否相等的简单函数(方法)。map构造方法,他是所有单词序偶的蛮力测试。

public  static boolean  oneCharOff(String word1,String word2){
if(word1.length!=word2.length){
  return false;
 }
  int  diffs=0;
for(int i=0;i<word1.length;i++){
  if(word1.charAt(i)!=word2.charAt(i)){
     if(++diffs>1){
    return false;
    }
  }
return diffs==1;
  }
}
  • 不要链表的散列
    解决冲突的三种方案:
    1.线性探测法
    函数f(x)是i的线性函数。
    2.平方探测法
    3.双散列
  • HashSet和HashMap通常是用分离链接散列实现的。hashSet提供equals()和hashCode()方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值