X32专项练习部分07

链表合并

		/*
        将两个长度为 len1 和 len2 的升序链表
        合并为一个长度为 len1+len2 的降序列表
        采用 归并算法,在最坏情况下,比较操作的次数与( )最接近 .
        len1+len2
        len1*len2
        min(len1,len2)
        max(len1,len2)
        
        正确答案:A
        首先链表反转的时间复杂度是O(n)和 O(m)
        然后将两个链表连接,(最优情况)当两个链表一个先走完,另一个没有动的时候结果最优
        也就是反转后len2表拼接len1正好符合降序
        最优的时间为min(len1,len2)
        (最坏情况)当两个链表交替进行的时候,
        举个例子
        len1:{1,3,5}
        len2:{2,4,6}
        连接两个链表的时间最长len1+len2。
         */

链表特点

		/*
        不属于链表特点的是()
        正确答案: C
        适用于频繁插入
        适用与频繁删除
        存取速度快
        方便扩充

        插入和删除操作可能需要对元素进行大量的移动
        链表的另外一个有点是具有可扩展性,相对于数组的固定大小而言
        由于存储空间不连续,它可以做到根据所需动态分配存储空间,因此具有良好的扩展性,方便扩充
        是对比数组来说的
        它的缺点也很明显,相对于元素按固定下标索引的数组而言,链表的索引更慢,存取速度也就更慢
        链表必须从链表头开始,依次向后查找,平均需要0(n)的时间,存取速度慢
         */

折半查找比较次数

		/*
        折半查找
        设有100个元素的有序表,采用折半查找方法,成功时最大的比较次数是() 。
        正确答案: D
        25
        50
        10
        7

        重点在于理解题意
        折半查找通俗来说就是一次性比较一半
        所以就是算100能被2除多少次
        换句话说,就是2的多少次幂大于100
         */

String,StringBuffer,StringBuilder的区别

        /*
        String
        StringBuffer
        StringBuilder

        三者的区别:
         */

        /*
        String 不可变的
            final关键字修饰 不可继承,更改
            对字符串进行拼接,裁剪都会创建新的字符串对象
            占用大量方法去内存
            造成性能的浪费
            所以频繁操作字符串
            会影响性能

			String string = "hello";
			string += " world";
			就以上两行代码导致在方法区字符串常量池中创建了3个对象
			"hello"
			" world"
			"hello world"
         */

        /*
        StringBuffer
        	默认初始化容量为16
            为解决String拼接操作产生多个中间对象问题的解决
            而提供的一个类
            拼接字符串采用append方法
            中间对象被垃圾回收期释放
            是线程安全的
            线程安全带来了额外的性能开销

			底层实际上是一个byte[]数组
			向StringBuffer里面添加字符串
			实际上是添加到byte[]数组里面了
			数组满了自动扩容
			
			优化:
			最好是指定一个合适的初始化容量
         */

        /*
        StringBuilder
            和StringBuffer没有本质的区别
            去掉了线程安全
            减少了额外开销
            成为了字符串拼接的首选
         */

列圈数表

	// 例1
	public void func5(int n){
   
        int i = n^2;
        while(i != 1){
   
            i = i / 2;
        }
    }
    /*
    第1步:列圈数表
    循环次数(t) 0   1   2   3   4   5   6
    主变量(i)  n^2 n^2/2 ... ... ... n^2/64

    得到i与t的关系:
        i = n^2 / 2^t

    第2步:找上限
        i = 1的时候会结束
    第3步:1,2联立
        1 = n^2 / 2^t
        解得:
        t = log2的n次方
    第4步:得到时间复杂度
        O(log2的n次方)
     */

	// 例2
	public void func6(int n){
   
        int x = 0;
        while(n >= (x + 1)*(x + 1)){
   
            x = x + 1;
        }
    }

    /*
    第1步:列圈数表
        t   0   1   2   3   4   5   6
        x   0   1   2   3   4   5   6
    第2步:找上限(这里没有具体的上限,只能找范围限制)
        范围限制:n = (x + 1)^2
    第3步:1,2联立,得到t和n的关系
        n = (t + 1)^2
        t = 根号n - 1
    第4步:得到时间复杂度:
        O(根号n)
     */

程序设计题:空格转换为%20

package du;

public class d746 {
   
    public static void main(String[] args) {
   
        String string = "hello world";
        String newString = replaceSpaceToChar(string);
        System.out.println(newString);
    }

    /**
     * 字符串中的空格替换成%20
     * @param string 传入的字符串
     * @return 替换过空格的字符串
     */
    public static String replaceSpaceToChar(String string){
   
        if (string == null){
   
            return null;
        }
        StringBuilder stringBuilder = new StringBuilder();

        for 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

muskfans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值