每日训练-day22

day22_0519

选择题

 1:简单选择  最好时间 O(n^2)      平均时间O(n^2)      最坏时间 O(n^2)
2:直接插入  最好时间 O(n)         平均时间O(n^2)      最坏时间 O(n^2)
3:冒泡排序  最好时间 O(n)         平均时间O(n^2)      最坏时间 O(n^2)
4:希尔排序  最好时间 O(n)         平均时间O(logn)     最坏时间 O(n^s) 1<s<2
5:快速排序  最好时间 O(nlogn)  平均时间O(nlogn)   最坏时间O(n^2) 
6:堆排序      最好时间 O(nlogn)  平均时间O(nlogn)   最坏时间O(nlogn) 
7:归并排序  最好时间 O(nlogn)  平均时间O(nlogn)   最坏时间O(nlogn) 

 线性表最常用得操作是存取任一指定序号的元素和在最后进行插入和删除运算;
进行任意位置存取,这个最省时省力的就是数组了,也就是顺序表。
而且元素是在最后的位置进行插入和删除运算,也就不涉及其他元素进行位移的额外操作,最多涉及的就是去扩展空间了。

 

 

 对于递归程序常见的优化手段有尾递归,迭代,循环
     尾递归:在每一次递归的过程中保持了上一次计算的状态,也就是“线性迭代过程”,即在函数返回时,调用自身本身 。尾递归和一般的递归不同在对内存的占用,普通递归创建stack累积而后计算收缩;而尾递归只会占用恒量的内存,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。 尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。

 end1 指向队头元素,end2 指向队尾元素的后一个位置,又因为循环队列放在一维数组A[0…M-1]中,那么end1指向队头元素即A[0],故end1 == 0。当队列初始化时,入队操作是把数据存放在数组A当中,然后end2自增,即可知end2 初值为0。因此,可知空队的条件是end1 == end2。
  考虑队列满情况,因为队列最多能容纳 M-1 个元素,假设队列存储在下标为0 到下标为M-2 的M-1 个区域,队头为A[0],队尾为A[M-2],此时队列满,end1 指向队头元素,可知end1=0;end2 指向队尾元素的后一个位置,可知end2=M-2+1=M-1。所以可知队满的条件为end1 == (end2+1) mod M,选A。

  补充: 循环队列的相关条件和公式

  队头指针是front,队尾指针是rear,QueueSize为循环队列的最大长度

 

 

编程

小易的升级之路

 

public class FightMonsters {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNextInt()){
            int[] ar=new int[2];
            for(int i=0;i<2;i++){
                ar[i]=sc.nextInt();
            }
            int n=ar[0];//怪兽数量
            int a=ar[1];//初始能力值
            int[] arr=new int[n];
            for(int i=0;i<arr.length;i++){
                arr[i]=sc.nextInt();
            }
            for(int i=0;i<arr.length;i++){
                if(arr[i]>a){
                    //怪兽的防御力大于小易的能力
                    int bi=arr[i];
                    a+=Divisor(bi,a);
                }else{
                    a+=arr[i];
                }
            }
            System.out.println(a);
        }
    }
    public static int Divisor(int bi,int c){
        int temp=0;
        for(int i=c;i>0;i--){
            if(bi%i==0&&c%i==0){
                temp=i;
                break;
            }
        }
        return temp;
    }
}

找出字符串第一个只出现一次的字符

 取出当前字符,拼接当前字符前后的字符串s,判断s中是否包含当前字符,没有就说明当前字符符合要求,输出结束;如果遍历完str字符串并没有找到输出-1;

public class FirstChar {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String str=sc.nextLine();
        boolean b=true;
        for(int i=0;i<str.length();i++){
           String  c=str.charAt(i)+"";
           String s=str.substring(0,i).concat(str.substring(i+1,str.length()));
            if(!s.contains(c)||s.equals("")){
                      b=false;
                System.out.println(c);
                break;
            }
        }
        if(b){
            System.out.println("-1");
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值