算法错题

1、给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

public class test {
    public int singleNumber(int[] nums){
        int num = 0;
        for(int i =0; i<nums.length; i++){
            num = num^nums[i];
        }
        return num;
    }
    public static void main(String[] args) {
      int[] num = {2,2,1};
      test t = new test();
      System.out.println(t.singleNumber(num));

    }
}

2、给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序 ## 数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6]

public class test {
    public void merge(int[] nums1, int m, int[] nums2, int n){
        int i = m - 1;
        int j = n - 1;
        int writeindex = m + n - 1;
        while(i >=0 && j >=0) {
            nums1[writeindex--] = nums1[i] > nums2[j] ? nums1[i--] : nums2[j--];
        }
        while(j>=0){
            nums1[writeindex--] = nums2[j--];
        }
        System.out.print("[");
        for(int k = 0; k < nums1.length; k ++){
            System.out.print(nums1[k]);
            if(k < nums1.length-1){
                System.out.print(",");
            }
        }
        System.out.println("]");
    }
    public static void main(String[] args) {
        int[] nums1 ={1,2,3,0,0,0};
        int[] nums2 = {2,5,6};
        int m = 3;
        int n = 3;
        test t = new test();
        t.merge(nums1,m,nums2,n);
    }
}

3、有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度。比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层。 问:如何用最少的尝试次数,测试出鸡蛋不会摔碎的临界点? 进阶版:你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。 你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。 每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。 你的目标是确切地知道 F 的值是多少。 无论 F 的初始值如何,你确定 F 的值的最小移动次数是多少?

在这里插入图片描述

public class solution {
    public int drop(int n){
        int a = 1;
        int b = 1;
        int c = -2 * n;
        double[] res = equation(a,b,c);
        return (int) Math.ceil(res[0]);
    }
    double[] equation(int a, int b, int c){
        double delta = b * b - 4 * a * c;
        double[] res = new double[1];
        if(delta < 0){
            return new double[0];
        }else if(delta > 0){
            double tmp1,tmp2;
            tmp1 = ((-b + Math.sqrt(delta))/(2 * a));
            tmp2 = ((-b - Math.sqrt(delta))/(2 * a));
            res[0] = Math.max(tmp1 , tmp2);
        }else{
            res = new double[]{-b/(2 * a)};
        }
        return res;
    }
    public int drop_dp(int n, int k) {
        int[][] dp = new int[n+1][k+1];//注意,这里初始化为0

        //边界
        for(int i=1; i<=n; i++) {
            dp[i][1] = i;
        }
        for(int j=1; j<=k; j++) {
            dp[1][j] = 1;
        }

        for(int i=1; i<=n; i++) {
            for(int j=1; j<=k; j++) {
                for(int t=1; t<i; t++) {
                    if(dp[i][j]==0) {//如果不分类,很多原始为0的取最小值就还为0
                        dp[i][j] = Math.max(dp[t - 1][j - 1], dp[i - t][j]) + 1;
                    }
                    else {
                        dp[i][j] = Math.min(Math.max(dp[t - 1][j - 1], dp[i - t][j]) + 1,dp[i][j]);
                    }
                }
            }
        }

        return dp[n][k];
    }


    public static void main(String[] args) {
        solution s = new solution();
        int res = s.drop(100);
        System.out.println(res);
        int n = s.drop_dp(10000,10);
        System.out.println(n);
    }
}

4、给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 示例 1: 输入: “A man, a plan, a canal: Panama” 输出: true 示例 2: 输入: “race a car” 输出: false

import java.util.Scanner;

public class solution {
    public boolean ishuishu(String text){

        char[] s1 = new char[text.length()];
        char[] s2 = new char[text.length()];
        boolean flag = true;
        for(int i =0; i <s1.length; i++){
            s1[i] = text.toCharArray()[i];
            s2[i] = text.toCharArray()[s2.length-i-1];
            if(s1[i] != s2[i]){
                flag = false;
            }
        }
        return flag;

    }

    public static String filter(String s){
        StringBuffer strBuf = new StringBuffer();
        for(int i =0; i <s.length(); i ++){
            if(Character.isLetterOrDigit(s.charAt(i)))//取出字符与数字部分
                strBuf.append(s.charAt(i));
        }
        return strBuf.toString();
    }
    public static void main(String[] args) {
        solution solution = new solution();
        Scanner in = new Scanner(System.in);
        System.out.println("Please enter a string");
        String s = in.nextLine();
        s =s.toLowerCase();//转化为小写
        String str = filter(s);
        System.out.println(solution.ishuishu(str));

    }
}

5、给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:

输入: “cbbd”
输出: “bb”
(使用中心扩展法,直观的想法测试超时)

public class test {
    public String longestPalindroms(String s){
        if(s == null || s.length() < 1)
            return "";
        int start = 0;
        int end = 0;
        for(int i = 0; i < s.length(); i ++){
            int len1 = expandAroundCenter(s,i,i);//回文字符是奇数
            int len2 = expandAroundCenter(s,i,i+1);//回文字符是偶数
            int len = Math.max(len1,len2);
            if(len > (end - start)){
                start = i - (len - 1)/2;
                end = i + len / 2;
            }
        }
        return s.substring(start,end+1);
    }
    //比较左右两个字符是否相同,一直向外扩
    private int expandAroundCenter(String s, int left, int right){
        int L = left, R = right;
        while(L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)){
            L--;
            R++;
        }
        return R - L -1;
    }
    public static void main(String[] args) {
        String s = "cdcabacb";
        test t = new test();
        System.out.println(t.longestPalindroms(s));

    }
}

6、给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

        public class ListNode {
            int val;
            ListNode next;
            public ListNode(int x){
                val = x;
            }
        }
    

public class Solution {
    public ListNode reverseKGroup(ListNode head, int k){
       ListNode prev = null;
       ListNode cur = head;
       ListNode next = null;
       ListNode check = head;
       int canProced = 0;
       int count = 0;
       //判断长度是否够k
       while(canProced < k && check !=null){
           check = check.next;
           canProced ++;
       }
       //如果长度够k则进行翻转
       if(canProced == k){
           while(count < k && cur != null){
               next = cur.next;
               cur.next = prev;
               prev = cur;
               cur = next;
               count++;
           }
           if(next != null){
               head.next = reverseKGroup(next,k);
           }
           int ss = prev.val;
           return prev;
       }//如果长度不够k则直接输出
       else{
           return head;
       }
    }
    //建链表
    public static ListNode build(int[] a){
        ListNode first = null,last = null,newNode;
        for(int i =0; i < a.length; i ++){
            newNode = new ListNode(a[i]);
            if(first==null || last==null){
                first = newNode;
                last = newNode;
            }else{
                last.next = newNode;
                last = newNode;
            }
        }
        return first;
    }

    public static void main(String[] args) {
        int[] a = new int[]{1,2,3,4,5};
        int k =2;
        Solution s = new Solution();
        ListNode listNode = build(a);
        ListNode listNode1 = s.reverseKGroup(listNode,k);
        while(listNode1!=null){
            System.out.println(listNode1.val);
            listNode1 = listNode1.next;
        }
    }
}
<think>嗯,用户遇到了Debian Jessie仓库无法更新的问题,提示“apt-secure repository does not have a Release file”。我需要先分析可能的原因。首先,Debian Jessie已经进入LTS阶段,可能官方仓库已经迁移到存档服务器了。原来的security仓库可能不再维护,导致Release文件缺失。 接下来,我应该检查用户是否还在使用旧的源列表。正确的做法是建议用户将源切换到archive.debian.org或者deb.debian.org的存档地址。此外,用户可能需要更新GPG密钥,因为旧的密钥可能已过期或被替换。 另外,用户可能没有正确配置源地址的组件,比如main、contrib、non-free部分是否齐全。需要提醒用户检查这些配置。还有,HTTPS支持可能需要安装apt-transport-https包,虽然Jessie默认应该支持,但确认一下也好。 然后,处理步骤应该包括修改sources.list文件,替换旧的URL,添加正确的deb行,可能还要导入新的密钥。最后执行apt-get update看看是否解决问题。如果还有其他问题,可能需要更详细的日志或者检查网络连接。 用户可能不太清楚如何编辑源列表,所以需要给出具体的命令示例,比如使用sed替换源地址,或者手动编辑文件。同时,提醒备份sources.list是个好习惯,防止出错。 最后,生成的相关问题应该覆盖常见后续疑问,比如如何完全升级系统、处理GPG错误、切换其他镜像源等。这样用户如果有其他问题,可以自行参考。</think>### Debian Jessie仓库Release文件缺失解决方案 Debian 8 "Jessie"已于2018年进入LTS(长期支持)阶段,其官方仓库已迁移至存档服务器。当出现"repository does not have a Release file"错误时,可按以下步骤修复: 1. **修改源列表** ```bash sudo sed -i 's/httpredir.debian.org/archive.debian.org/g' /etc/apt/sources.list sudo sed -i 's/security.debian.org/archive.debian.org\/debian-security/g' /etc/apt/sources.list ``` 2. **推荐的安全源配置** ```bash deb http://archive.debian.org/debian/ jessie main contrib non-free deb http://archive.debian.org/debian-security/ jessie/updates main ``` 3. **添加LTS支持源** ```bash deb http://deb.debian.org/debian jessie-backports main ``` 4. **更新软件包列表** ```bash sudo apt-get update -o Acquire::Check-Valid-Until=false ``` **注意**:需强制忽略过期时间戳检查[^1]。如果出现GPG错误,需导入新密钥: ```bash sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B48AD6246925553 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值