算法练习题(涉外黄成老师)

news2024/11/25 23:18:15

1.带锁的门在走廊上有n个带锁的门,从1到n依次编号。最初所有的门都是关着的。我们从门前经过n次,每一次都从1号门开始。在第i次经过时(i=1,2,…,n)我们改变i的整数倍号锁的状态:如果门是关的,就打开它;如果门是打开的,就关上它。在最后一次经过后,哪些门是打开的,哪些门是关上的?有多少打开的门?

package Demo1;

import java.util.Scanner;

public class ss2 {
    public static void main (String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int number=0;
        int close[] =new int[n+1];
        for (int i=0;i<n;i++){
            int j=i+1;
            if(j*j<=n){
                close[(int) Math.pow(j,2)]++;
            }
        }
        System.out.println("打开的编号:");
        for (int i=1;i<=n;i++){
            if(close[i]==1){
                System.out.println(i+"");
                number++;
            }
        }
        System.out.println("\n关门的编号");
        for(int i=1;i<=n;i++){
            if(close[i] !=1){
                System.out.println(i+"");
            }
        }
        System.out.println("\n开门数:"+number);
    }
}

在这里插入图片描述

2.现代谜题有4个人打算过桥,他们都在桥的某一端。我们有17分钟让他们全部到达大桥的另一头。时间是晚上,他们只有一只手电筒。一次最多只能有两个人同时过桥,而且必须携带手电筒。必须步行将手电筒带来带去,即扔来扔去是不行的。每个人走路的速度不同:甲过桥要用1分钟,乙要用2分钟,丙要用5分钟,丁要用10分钟。两个人一起走的速度等于其中走得慢的那个人的速度。(注意,根据网上传言,西雅图附近一家著名软件公司的主考官就是用这个问题来考面试者的。)

甲乙先过去,甲回来,3分钟
丙丁过去,乙回来,12分钟
甲乙过去,2分钟
共计17分钟

package Demo1;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ss3 {

        private static final String COMMA = ",";
        // 过桥规定时间不得多于17分钟
        private static final int SCHEDULT_TIME = 17;
        private static final String LEFT_SYMBOL = "{";
        private static final String RIGHT_SYMBOL = "}";
        private static final String GO_WORD = "过桥去了";
        private static final String BACK_WORD = "我又返回了";
        private static final String LEFT_ALLOW = "--->";
        private static final String RIGHT_ALLOW = "<---";
        private static final String NEW_LINE = "\n";

        private static int count = 1;

        private static Map<String, Integer> map = new HashMap<>();

        static {
            map.put("A", 1);
            map.put("B", 2);
            map.put("C", 5);
            map.put("D", 10);
        }

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            List<String> list = new ArrayList<>();
            list.add("A");
            list.add("B");
            list.add("C");
            list.add("D");
            StringBuffer sb = new StringBuffer();
            int initTime = 0;
            new CrossBridge().resultCross(list, new ArrayList<String>(), initTime, sb);
        }

        /**
         * 处理过桥事件
         *
         * @param listNot
         *            未过桥人员列表
         * @param ListOver
         *            已过桥人员列表
         * @param initTime
         *            花费的时间
         * @param sb
         *            记录步骤过程
         */
        private void resultCross(List<String> listNot, List<String> ListOver, int initTime, StringBuffer sb) {

            // 获取未过桥的所有两两组合的可能组合
            List<String> result = getAllResult(listNot);

            for (String groupPeople : result) {
                // 因为列表数据是【a,b a,c a,d】这种格式
                String[] peoples = groupPeople.split(COMMA);
                //表示未过桥的人员列表
                List<String> current = new ArrayList<>(listNot);
                //表示已过桥的人员列表
                List<String> over = new ArrayList<>(ListOver);
                int currentTime = initTime;
                StringBuffer currentBuffer = sb;
                // 过桥后人数变动
                for (String people : peoples) {
                    // 未过桥列表减去过桥人员
                    current.remove(people);
                    // 已过桥列表增加过桥人员
                    over.add(people);
                }

                currentTime += getMaxTime(peoples);
                // 记录一条步骤--》{a,b}--->过桥去了
                currentBuffer.append(current).append(LEFT_ALLOW).append(LEFT_SYMBOL).append(groupPeople).append(RIGHT_SYMBOL).append(GO_WORD).append(LEFT_ALLOW).append(over).append(NEW_LINE);
                // 人员全部过完情况
                if (current.isEmpty()) {

                    if (currentTime <= SCHEDULT_TIME) {
                        System.out.println("第" + count + "种情况:");
                        System.out.println("花费时间--》" + currentTime);
                        System.out.println("步骤详情--》");
                        System.out.println(currentBuffer.toString());
                        count++;
                    }
                } else {
                    // 没有全部过桥情况,得从过桥列表中返回一个人
                    for (String peopleToBack : over) {
                        //表示已过桥的人员列表
                        List<String> overGroup = new ArrayList<>(over);
                        //表示未过桥的人员列表
                        List<String> waitGroup = new ArrayList<>(current);
                        int nowTime = currentTime;
                        StringBuffer nowBuffer = new StringBuffer(currentBuffer.toString());
                        // 已过桥列表删除返回的人员
                        overGroup.remove(peopleToBack);
                        // 未过桥列表增加返回的人员
                        waitGroup.add(peopleToBack);
                        // 加上返回时间
                        nowTime += map.get(peopleToBack);

                        // 返回的步骤
                        nowBuffer.append(waitGroup).append(RIGHT_ALLOW).append(LEFT_SYMBOL).append(peopleToBack).append(RIGHT_SYMBOL).append(BACK_WORD)
                                .append(RIGHT_ALLOW).append(overGroup).append(NEW_LINE);
                        // 递归,重新重复以上步骤
                        resultCross(waitGroup, overGroup, nowTime, nowBuffer);
                    }

                }

            }

        }

        /**
         * 返回时间最多的那个
         * @param peoples
         * @return
         */
        private int getMaxTime(String[] peoples) {
            // peoples[a,b],根据key找到存在map里面对应的时间,比较2者大小,返回最大时间
            return Math.max(map.get(peoples[0]), map.get(peoples[1]));
        }

        /**
         * 获取未过桥的所有两两组合的可能组合
         *
         * @param listNot
         *            未过桥人员列表
         * @return
         */
        private List<String> getAllResult(List<String> listNot) {
            // 把列表类型转换成字符串数组
            int len = listNot.size();
            String[] str = new String[len];
            listNot.toArray(str);
            int i, j;
            List<String> result = new ArrayList<>();
            for (i = 0; i < len - 1; i++) {
                for (j = 0; j < len; j++) {
                    // 如果组合是【a,a】或者result已经存在组合【a,b】还是【b,a】的情况就不往列表里加数据,其他组合加进列表。
                    if (!str[i].equals(str[j]) && !result.contains(str[i] + COMMA + str[j])
                            && !result.contains(str[j] + COMMA + str[i])) {
                        result.add(str[i] + COMMA + str[j]);
                    }
                }
            }
            // 组合格式:[A,B , A,C , A,D , B,C , B,D , C,D]
            return result;
        }

    }


3.页面编号 假设页面从1开始连续编号,共有1000页。计算所有页码中十进制数字的总个数。
分成四个区间
1-9,10-99,100-999,1000

4.名人问题n个人中的名人是指这样一个人:他不认识别人,但是每个人都认识他。任务就是找出这样一个名人,但只能通过询问“你认识他/她吗?”这种问是来完成。设计一个高效算法,找出该名人或者确定这群人中没有名人。你的算法在最坏情况下需要问多少个问题?

我们把人编号,比如从1 到 N。
我们考虑最坏情况:你问每一个人是否认识 X ,如果大家都认识,那么 X 一定是名人,如果其中一个人说不认识,那么那个人一定不是名人。因为 X 的范围是 1 到 N, 所以,在最坏情况下,我们 要问 (N - 1)
N 个问题。
但是,有一种更好的方法。我们从1开始,依次问他是否认识他的下一个,比如 2, 如果 1 说认识,那么 1 一定不是名人,2 有可能是名人; 如果1 说不认识,2 一定不是名人,1 却有可能是名人。这是这个方法巧的地方。所以,不管1 回答是还是不是,我们都可以确定其中一个不是名人,然后,我们继续问 可能是名人那一位 是否认识 3, 然后依次下去,直到第 N 个人。这样我们就可以只要问 (N - 1) 个问题就可以把名人找出来。
*

package Demo1;

import java.util.Stack;

public class ss4 {
     // Celebrity ID 2
        static int MATRIX[][] = {
                { 0, 0, 1, 0 },
                { 0, 0, 1, 0 },
                { 0, 0, 0, 0 },
                { 0, 0, 1, 0 }
        };

        // 如果a认识b,则返回true;否则返回 false
        static boolean knows(int a, int b) {
            boolean res = (MATRIX[a][b] == 1) ? true : false;
            return res;
        }


        // 如果名人celebrity存在,则返回 ID值,值的范围在 0到n-1之间;否则返回 -1
        static int findCelebrity(int n) {
            Stack<Integer> st = new Stack<>();
            int c;

            // Step 1 :把每一个人压入堆栈中
            for (int i = 0; i < n; i++) {
                st.push(i);
            }

            while (st.size() > 1) {
                // Step 2 :将前两个人弹出堆栈,根据已知(A,B)的返回状态丢弃一个人。
                int a = st.pop();
                int b = st.pop();

                // Step 3 : 将剩余的人压入堆栈中
                if (knows(a, b)) {
                    st.push(b);
                }

                else
                    st.push(a);
            }

            c = st.pop();

            // Step 4: 检查最后一个人是否是名人(Celebrity)
            for (int i = 0; i < n; i++) {

                //如果任何人都不是Celebrity;或者认识c或者a;或者认识任何人,则返回-1
                if (i != c && (knows(c, i) || !knows(i, c)))
                    return -1;
            }
            return c;
        }

        public static void main(String[] args) {
            int n = 4;
            int result = findCelebrity(n);
            if (result == -1) {
                System.out.println("No Celebrity");
            } else
                System.out.println("Celebrity ID " + result);
        }
    }



5.爬梯子 假设每一步可以爬一格或者两格梯子,爬一部n格梯子一共可以用几种方法?(例如,一部三格的梯子可以用三种不同的方法爬:1-1-1,1-2 和2-1。
要到达n阶台阶,必须从n-2阶跨两步,或者n-1阶跨一步
所以,n阶的方法f(n)可以为f(n-2)+f(n-1)

暴力方法(此方法会造成内存溢出)

   function climbStairs($n) {
    	if ($n<3) return $n;
        return climbStairs($n-2)+climbStairs($n-1);
    }

斐波那契函数(其实就是个f(n)=f(n-1)+f(n-2))

 function climbStairs($n) {
    	$arr[1] = 1;
    	$arr[2] = 2;
    	for ($i=3;$i<=$n;$i++) {
    		$arr[$i] = $arr[$i-1]+$arr[$i-2];	
    	}
    	return $arr[$n];
    }

#递推 (动态规划思想)

f = [0] * 50
f[0] = 1
f[1] = 1
f[2] = 2
f[3] = 4
for i in range(4,50,1):
    f[i] = f[i-1] + f[i-2] + f[i-3]

print(f[4])
print(f[5])

6.交替放置的玻璃环有2n个玻璃杯挨个排成一行,前n个装满苏打水,其余n个杯子为空。交换杯子的位置,使之按照满一空一满一空的模式排列,而且杯子动的次数要最少([Gar78],p.7)。
给2n个杯子从左至右从1开始依次编号,将第2个杯子与第n-1个杯子互换,那么此问题转化为2(n-2)个杯子的问题。交换次数M(n)=M(n-2)+1,当n>2时; M(1)=0;M(2)=1.

public class CupInsert {
static int count = 0;
public static void main(String[] args) {
System.out.println("请输入n的值(n>0):");
Scanner scanner = new Scanner(System.in);
String read = scanner.nextLine();
int n = Integer.parseInt(read);
arrayBulid(n);
System.out.println("杯子交换前的顺序(1-黑,0-白):");
for(int i=0;i<arrayBulid(n).length;i++){
System.out.print(arrayBulid(n)[i]+"--");
if((i+1)%10==0){
System.out.println(" ");
}
}
System.out.println(" ");
int[] result = cpuInsert(arrayBulid(n),n);
System.out.println("杯子交换后的顺序(1-黑,0-白):");
for(int i=0;i<=2*n-1;i++){
System.out.print(result[i]+"--");
if((i+1)%10==0){
System.out.println(" ");
}
}
System.out.println(" ");
System.out.println("交换的次数:"+count);
}
/*
*判断n为奇数还是偶数,然后交换杯子,得到交换杯子的序列以及交换次数
*/

private static int[] cpuInsert(int[] arrayBulid, int n) {
if(n%2==0){
for(int j=n;j<=2*n-1;j=j+2){
for(int i=0;i<n-1;i++){
if((arrayBulid[i]+arrayBulid[j]==1)&&(arrayBulid[i+1]+arrayBulid[j]==1)){
int t = arrayBulid[i+1];
arrayBulid[i+1]=arrayBulid[j];
arrayBulid[j]=t;
i=n-1;
}
}
count=count+1;
}
}else{
for(int j=n+1;j<=2*n-1;j=j+2){
for(int i=0;i<n-1;i++){
if((arrayBulid[i]+arrayBulid[j]==1)&&(arrayBulid[i+1]+arrayBulid[j]==1)){
int t = arrayBulid[i+1];
arrayBulid[i+1]=arrayBulid[j];
arrayBulid[j]=t;
}
}
count=count+1;
}
}

return arrayBulid;

}

/*
*构建存放原始杯子顺序的数组
*/
private static int[] arrayBulid(int n) {
int cup[] = new int[2*n];
for(int i=0;i<n;i++){
cup[i] = 1;
}
for(int i=n;i<2*n;i++){
cup[i] = 0;
}
return cup;
}

}

7.展会彩灯 早些年,在展会上 可能会看到这样一种彩灯:一个被连接到若干开关上的电灯泡,只当所有开关都闭团合的时候才会发光。每一个开关由一个按钮控制;按下按钮就会切换开关状态,但是开关的状态是无法知道的。目标就是点亮灯泡。设计一个点亮灯泡的算法,使其在有n个开关时,在最坏的情况下,需要按动按钮的次数最少。

可以利用二进制反射格雷码的特性,相邻两个位串只相差一位数字,而2n个位串都是不同的。将n个开关分别对应n位二进制格雷码的每一位,每当格雷码的序列某一位发生变化,切换对应的开关状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CEC2015:(二)动态多目标野狗优化算法DMODOA求解DIMP2、dMOP2、dMOP2iso、dMOP2dec(提供Matlab代码)

一、cec2015中测试函数DIMP2、dMOP2、dMOP2iso、dMOP2dec详细信息 CEC2015&#xff1a;动态多目标测试函数之DIMP2、dMOP2、dMOP2iso、dMOP2dec详细信息 二、动态多目标野狗优化算法 多目标野狗优化算法&#xff08;Multi-Objective Dingo Optimization Algorithm&#xff0…

#入坑keychron#你还没一起入坑吗?

经济和科技飞速发展的今天&#xff0c;我们早已不在像从前那样有电脑玩就行&#xff0c;现在的我们追求的是更高的配置、更好的体验&#xff0c;就像从前一碗泡面就是最高的理想&#xff0c;而现在最少都得有根泡面搭档才能勉强接受&#xff0c;连泡面都有搭档&#xff0c;电脑…

web前端期末大作业:旅游网页设计与实现——个人旅游博客(4页)HTML+CSS

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

【后端】初识HTTP_2

我们学习的HTTP协议&#xff0c;是应用层里面最广泛使用的协议~ 我们主要是学习HTTP的请求响应的报文格式 我们可以借助抓包工具来学习&#xff0c;抓包抓到的是文本格式~~ 根据上节内容 我们大概了解了请求和响应的格式 请求有4部分&#xff1a; &#xff08;1&#xff…

leetcode 51. N皇后 回溯法求解(c++版本)

题目描述 简单来说就给一个N*N的棋盘 棋盘上的每一列每一行以及每一个对角不能出现两个皇后 因此明确以下几点 要找出所有可能的解法也是采用回溯法进行求解&#xff08;具体在下面进行详解&#xff09; 用下面一张示例图来说明回溯法的思路 说白了就是进行搜索&#xff0c;…

java项目-第102期基于ssm的校园二手交易平台-java毕业设计

java项目-第102期基于ssm的校园二手交易平台 【源码请到资源专栏下载】 1、项目简述 Hi&#xff0c;大家好&#xff0c;今天分享的源码是基于ssm的校园二手交易平台。 该交易平台分为两部分&#xff0c;前台和后台。用户在前台进行商品选购以及交易&#xff1b;管理员登录后台可…

python-(6-3-3)爬虫---requests入门(对参数封装)

文章目录一 需求二 分析三 代码四 补充说明一 需求 爬取豆瓣电影的“纪录片”的电影信息数据 二 分析 老规矩&#xff0c;先在网页的“检查”中提取我们需要的信息 如下图所示。在“纪录片”那一页面&#xff0c;选择"network"----“XHR”----“preview”。 我们…

【附源码】Python计算机毕业设计面向社区的购物平台系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

java计算机毕业设计ssm+vue网络考试信息网站

项目介绍 对网络考试系统进行了介绍&#xff0c;包括研究的现状&#xff0c;还有涉及的开发背景&#xff0c;然后还对系统的设计目标进行了论述&#xff0c;还有系统的需求&#xff0c;以及整个的设计方案&#xff0c;对系统的设计以及实现&#xff0c;也都论述的比较细致&…

五大模型看深度学习用于时序预测的最新进展

引言 在以往的时序预测中&#xff0c;大部分使用的是基于统计和机器学习的一些方法。然而&#xff0c;由于深度学习在时间序列的预测中表现并不是很好&#xff0c;且部分论文表述&#xff0c;在训练时间方面&#xff0c;用 Transformer、Informer 、Logtrace 等模型来做时间序…

ESP32 入门笔记06: FreeRTOS+《两只老虎》 (ESP32 for Arduino IDE)

ESP32FreeRTOS Esp32 模块中已经提供了 FreeRTOS&#xff08;实时操作系统&#xff09;固件。 FreeRTOS有助于提高系统性能和管理模块的资源。FreeRTOS允许用户处理多项任务&#xff0c;如测量传感器读数&#xff0c;发出网络请求&#xff0c;控制电机速度等&#xff0c;所有…

旅游推荐系统

摘要 随着社会的发展&#xff0c;人们生活水平的提高&#xff0c;旅游逐渐成为人们生活中的重要活动&#xff0c;2019年国内旅游人数超过60亿人次。并且&#xff0c;旅游业已经成为了我国经济发展的一个重要支柱&#xff0c;近年来我国旅游业对GDP贡献值呈上升趋势。2019年&am…

【附源码】计算机毕业设计java装修服务分析系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【数据结构】链表OJ特别篇 —— 面试情景带你深度剖析 环形链表系列问题 复制带随机指针的链表

文章目录0. 前言1. 环形链表2. 环形链表延伸问题3. 环形链表 II4. 复制带随机指针的链表5. 结语0. 前言 Hello&#xff0c;大家好&#xff0c;我是anduin。这期的内容依然是链表OJ。但与前两期不同的是&#xff0c;这次我会模拟面试的情景&#xff0c;由浅入深&#xff0c;以生…

冶金行业数字化供应链管理系统:赋能企业端到端供应链优化,推动行业数字化变革

作为国之重器&#xff0c;冶金行业在国家大基建战略的支持下&#xff0c;迎来了新一轮的发展良机&#xff0c;然而冶金行业整体产能过剩、对于产业链下游依赖严重等情况依然突出&#xff0c;机遇与挑战并存&#xff0c;在此环境下&#xff0c;如何在激烈的竞争中提升企业自身竞…

多对一和一对多的处理P21,P22

多对一&#xff1a; 按照查询嵌套处理&#xff1a; StudentMapper&#xff1a;&#xff08;接口很简单需要返回一个List&#xff09; package com.Li.dao;import com.Li.pojo.Student; import org.apache.ibatis.annotations.Select;import java.util.List;public interface …

无人机和热成像

当它变得可见时&#xff0c;看不见的世界是一个令人惊叹的景象。 热成像就是这样&#xff0c;透过使用专门的摄影机和技术&#xff0c;使看不见的红外光谱可见。 我们周围那个无形的世界隐藏着什么&#xff0c;这是一个完整的隐藏世界。 图片来源&#xff1a;Keith Davis/热成像…

腾讯面试真题 | 没在我八股文列表里。。。

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

零基础自学javase黑马课程第十天

零基础自学javase黑马课程第十天 ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&#x1f39e;2022年11月1日&#x…

【MySQL】深入理解MySQL索引优化器工作原理

本文导读 本文将解读MySQL数据库查询优化器&#xff08;CBO&#xff09;的工作原理。简单介绍了MySQL Server的组成&#xff0c;MySQL优化器选择索引额原理以及SQL成本分析&#xff0c;最后通过 select 查询总结整个查询过程。 一、MySQL 优化器是如何选择索引的 下面我们来…