[2017校招]大可打卡1

本文精选了来自各大互联网公司的面试编程题目,涵盖了数组操作、字符串处理、动态规划等多个方面,通过实际代码示例深入剖析了解决问题的方法和思路。

1.网易-合唱团

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			int n=sc.nextInt();  //获取学生的人数
			int[] arr=new int[n+1]; //创建一个表示学生能力的数组,第i个数等于第i个人的能力
			//对学生能力进行初始化
			for(int i=1;i<=n;i++){
				arr[i]=sc.nextInt();
			}
			int kk=sc.nextInt(); //选择的学生数
			int d=sc.nextInt(); //间距
			
			//人直接对应坐标,n和kk都要加一
			long[][] f=new long[n+1][kk+1];
			long[][] g=new long[n+1][kk+1];
			//初始化k=1的情况
			for(int one=1;one<=n;one++){
				f[one][1]=arr[one];
				g[one][1]=arr[one];
			}
			
			//自底向上递推
			for(int k=2;k<=kk;k++){
				for(int one=k;one<=n;one++){
					long tempmax=Long.MIN_VALUE;
					long tempmin=Long.MAX_VALUE;
					for(int left=Math.max(k-1,one-d);left<=one-1;left++){
						if(tempmax<Math.max(f[left][k-1]*arr[one], g[left][k-1]*arr[one])){
							tempmax=Math.max(f[left][k-1]*arr[one], g[left][k-1]*arr[one]);
						}
						if(tempmin>Math.min(f[left][k-1]*arr[one], g[left][k-1]*arr[one])){
							tempmin=Math.min(f[left][k-1]*arr[one], g[left][k-1]*arr[one]);
						}
					}
					f[one][k]=tempmax;
					g[one][k]=tempmin;
				}
			}
			//然后n选k需要从最后一个最大的位置选
			long result=Long.MIN_VALUE;
			for(int one=kk;one<=n;one++){
				if(result<f[one][kk]){
					result=f[one][kk];
				}
			}
			System.out.println(result);
			
		}
		
	}

}

2.猪八戒-数串

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class Main {

	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			//数的个数n,以及把n个数存到list里面
			int n=sc.nextInt();
			List<Integer> list=new ArrayList<Integer>();
			for(int i=0;i<n;i++){
				list.add(sc.nextInt());
			}
			Collections.sort(list, new Comparator<Integer>() {

				@Override
				public int compare(Integer o1, Integer o2) {
					String s1=String.valueOf(o1);
					String s2=String.valueOf(o2);
					return (s2+s1).compareTo(s1+s2);
				}
			});
			for(int i=0;i<list.size();i++){
				System.out.print(list.get(i));
			}
			System.out.println();
		}
	}
}

3.网易-优雅的点

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int r2=sc.nextInt();//得到半径的平方
		double r=Math.sqrt(r2);//开方得到半径
		int count=0;
		for(int x=0;x<r;x++){
			double j=Math.sqrt(r2-x*x);
			if((int)j==j){
				count++;
			}
		}
		System.out.println(count<<2);
	}

}

4.网易-下厨房

import java.util.HashSet;
import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		HashSet<String> set=new HashSet<>();
		while(sc.hasNext()){
			String[] str=sc.nextLine().split(" ");
			for(int i=0;i<str.length;i++){
				set.add(str[i]);
			}
			
		}
		System.out.println(set.size());
	}

}

5.网易有道-洗牌

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class Main {
	public static ArrayList<Integer> shuffle(ArrayList<Integer> arr){
		ArrayList<Integer> tmp=new ArrayList<>();
		int times=arr.get(1); //取到了次数
		for(int timesTmp=1;timesTmp<=times;timesTmp++){
			int middle=(arr.size()-2)/2+1;  // middle就是左手最后一个,arr.size-1是右手最后一个
			int end=arr.size()-1;
			Stack<Integer> stack=new Stack<>();  //把数都存到堆栈里
			
			while(middle>1){
				stack.push(arr.get(end));
				stack.push(arr.get(middle));
				end--;
				middle--;
			}
			
			//洗牌一次结束以后要把arr给改掉,在前一次洗牌的基础上进行下一次洗牌
			for(int i=2;i<arr.size();i++){
				arr.set(i, stack.pop());
			}
		}
		//前两个数不要了
		for(int i=2;i<arr.size();i++){
			tmp.add(arr.get(i));
		}
		return tmp;
		
	}
	
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int t=sc.nextInt();//一共有几组数据
		while(t--!=0){
			
			int number=sc.nextInt();  //第一组数的个数
			int times=sc.nextInt();    //第一组数洗牌的次数
			ArrayList<Integer> arr=new ArrayList<>();
			arr.add(number);
			arr.add(times);
			for(int i=0;i<number*2;i++){
				arr.add(sc.nextInt());
			}
			ArrayList<Integer> result=shuffle(arr);
			for(int i=0;i<result.size()-1;i++){
				System.out.print(result.get(i)+" ");
			}
			System.out.println(result.get(result.size()-1));
	}

	}
}

6.网易-回文序列

import java.util.ArrayList;
import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			//n数的个数
			int n=sc.nextInt();
			//把n个数存到一个ArrayList里
			ArrayList<Integer> list=new ArrayList<>();
			for(int i=0;i<n;i++){
				list.add(sc.nextInt());
			}
			
			int count=0;
			while(list.size()>1){
				if(list.get(0)<list.get(list.size()-1)){
					int a=list.get(0);
					int b=list.get(1);
					list.set(1, a+b);
					list.remove(0);
					count++;
				}else if(list.get(0)>list.get(list.size()-1)){
					int a=list.get(list.size()-1);
					int b=list.get(list.size()-2);
					list.set(list.size()-2, a+b);
					list.remove(list.size()-1);
					count++;
				}else{ //如果相等
					list.remove(0);
					list.remove(list.size()-1);
				}
			}
			System.out.println(count);
			
		}
		
	}

}

7.小米-句子反转

import java.util.Scanner;
public class Main {
	public static String reverse(String str){
		StringBuilder sb=new StringBuilder();
		for(int i=str.length()-1;i>=0;i--){
			sb.append(str.charAt(i));
		}
		return sb.toString();
	}
	//先翻转整个句子,再翻转句子里面的每个单词
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			String str=sc.nextLine();
			String reStr=reverse(str);
			String[] sentence=reStr.split(" ");
			StringBuilder sb=new StringBuilder();
			for(int i=0;i<sentence.length-1;i++){
				System.out.print(reverse(sentence[i])+" ");
			}
			System.out.print(reverse(sentence[sentence.length-1]));
			
		}
	}

}

8.网易-数字翻转

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int x=sc.nextInt();
		int y=sc.nextInt();
		int sum=reverseNum(x)+reverseNum(y);
		System.out.println(reverseNum(sum));
		
	}
	public static int reverseNum(int x){
		StringBuilder sb=new StringBuilder();
		String strx=String.valueOf(x);
		for(int i=strx.length()-1;i>=0;i--){
			sb.append(strx.charAt(i));
		}
		return Integer.valueOf(sb.toString());
	}

}

9.滴滴出行-连续最大和

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();//一共有n个数
		while(sc.hasNext()){
			int[] arr=new int[n];
			for(int i=0;i<n;i++){
				arr[i]=sc.nextInt();
			}
			int max=arr[0];
			int cur=arr[0];
			for(int i=1;i<n;i++){
				if(cur<0){
					cur=arr[i];
				}else{
					cur+=arr[i];
				}
				if(cur>max){
					max=cur;
				}
			}
			System.out.print(max);
		}
	}

}

10.挖财-水仙花数

import java.util.ArrayList;
import java.util.Scanner;
public class Main {
	public static boolean isNarcissisticNumber(int n){
		String str=String.valueOf(n);
		int[] arr=new int[str.length()];
		for(int i=0;i<arr.length;i++){
			arr[i]=Integer.valueOf(str.charAt(i)-48);
		}
		int result=0;
		for(int i=0;i<arr.length;i++){
			result+=Math.pow(arr[i], 3);
		}
		if(result==n){
			return true;
		}
		return false;
	}
	
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			int m=sc.nextInt();
			int n=sc.nextInt();
			ArrayList<Integer> result=new ArrayList<>();
			for(int i=m;i<=n;i++){
				if(isNarcissisticNumber(i)){
					result.add(i);
				}else{
					continue;
				}
			}
			if(result.isEmpty()){
				System.out.println("no");
			}else{
				for(int i=0;i<result.size()-1;i++){
					System.out.print(result.get(i)+" ");
				}
				System.out.print(result.get(result.size()-1));
			}
			
			
		}
	}

}

11.网易-分苹果

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();  //4
		while(sc.hasNext()){ 
			int[] a=new int[n];
			int sum=0;
			for(int i=0;i<n;i++){
				a[i]=sc.nextInt();
				sum+=a[i];
			}
			//System.out.println("sum:"+sum);
			int[] dif=new int[n];
			int average=0;
			if(sum%n!=0){
				System.out.print(-1);
                return;
			}else{//如果n可以整除sum
				average=sum/n;
				//System.out.println("average:"+average);
				for(int i=0;i<n;i++){
					dif[i]=a[i]-average;//每一只牛有的苹果和平均数的差值
					if(dif[i]%2==0){
						continue;
					}else{
						System.out.print(-1);
						return;
					}
				}
			}
			int count=0;
			int sumdif=0;
			for(int i=0;i<n;i++){
				if(dif[i]>0){
					sumdif+=dif[i];
				}else{
					continue;
				}
			}
			//System.out.println("sumdif:"+sumdif);
			count=sumdif/2;
			System.out.print(count);
		}
	}

}

12.网易-买苹果

import java.util.ArrayList;
import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		//想买n个苹果
		int n=sc.nextInt();
		ArrayList<Integer> steps=new ArrayList<>();
		//把steps数组里的值都先初始化为Integer.max,如果是max的话说明不可达,即不能恰好买i个苹果
		for(int i=0;i<=n;i++){
			steps.add(Integer.MAX_VALUE);
		}
		//购买第0个
		steps.set(0, 0);
		if(n>=6){
			steps.set(6, 1);
		}
		if(n>=8){
			steps.set(8, 1);
		}
		for(int i=6;i<=n;i++){
			if(steps.get(i)==Integer.MAX_VALUE){
				continue;
			}else{
				if(i+6<=n){
					int min=Math.min(steps.get(i)+1, steps.get(i+6));
					steps.set(i+6, min);
				}
				if(i+8<=n){
					int min=Math.min(steps.get(i)+1, steps.get(i+8));
					steps.set(i+8, min);
				}
			}
		}
		if(steps.get(n)==Integer.MAX_VALUE){
			System.out.print(-1);
		}else{
			System.out.print(steps.get(n));
		}
	}

}

13.京东-幸运数

import java.util.Scanner;
public class Main {
	// f(x)表示把x这个数用十进制写出后各个数位上的数字之和
	public static int f(int x){
		int sum=0;
		while(x!=0){
			sum+=x%10;
			x=x/10;
		}
		return sum;
	}
	//g(x)表示把x这个数用二进制写出后各个数位上的数字之和
	public static int g(int x){
		int sum=0;
		while(x!=0){
			sum+=x%2;
			x=x/2;
		}
		return sum;
		
	}
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();//n<=100000
		int count=0;
		for(int i=1;i<=n;i++){
			if(f(i)==g(i)){
				count++;
			}
		}
		System.out.println(count);
	}

}

14.网易-Fibonacci数列

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt(); //输入的数字
		int a=0;
		int b=1;
		while(b<=n){
			b=a+b; //把b往下一个
			a=b-a; //把a往下一个
		}
		//b>n时就得到了最接近n的那两个数,一个是b,一个是a
		int result=(b-n)>(n-a)?n-a:b-n;
		System.out.println(result);
	}

}

15.网易-计算糖果

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int[] arr=new int[4];
		int A=0;
		int B=0;
		int C=0;
		for(int i=0;i<4;i++){
			arr[i]=sc.nextInt();
		}
		if((arr[0]+arr[2])%2==0){
			A=(arr[0]+arr[2])/2;
		}else{
			System.out.println("No");
			return;
		}
		if((arr[1]+arr[3])%2==0){
			B=(arr[1]+arr[3])/2;
		}else{
			System.out.println("No");
			return;
		}
		C=arr[3]-B;
        if(A<0||B<0||C<0){
			System.out.println("No");
			return;
		}
		System.out.print(A+" "+B+" "+C);
	}

}

16.挖财-求数列的和

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		double n=sc.nextInt();
		int m=sc.nextInt();
		double sum=0;
		for(int i=m;i>0;i--){
			sum+=n;
			n=Math.sqrt(n);
		}
		System.out.println(String.format("%.2f", sum));
	}

}

17.网易-星际穿越

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){ //针对每一组
			long h=sc.nextLong();
			//用二分
			long x=(long) Math.pow(h, 0.5);
			if(x*(x+1)>h){
				System.out.println(x-1);
			}else{
				System.out.println(x);
			}
		}
		
	}


}

18.京东-集合

import java.util.TreeSet;
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
		//每一个输入包括三行
		
		int n=sc.nextInt();//第一个集合有几个数字
		int m=sc.nextInt();//第二个集合有几个数字
        TreeSet<Integer> set=new TreeSet<Integer>();
        int num=n+m;
        while(num--!=0){
            set.add(sc.nextInt());
        }
        Object[] arr=set.toArray();
        for(int i=0;i<arr.length-1;i++){
        	System.out.print(arr[i]+" ");
        }
        System.out.print(arr[arr.length-1]);
     
    }
}

19.网易-解救小易

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			//获取陷阱的数量
			int traps=sc.nextInt();
			int[][] positions=new int[traps][2];
			for(int i=0;i<traps;i++){
				positions[i][0]=sc.nextInt();
			}
			for(int i=0;i<traps;i++){
				positions[i][1]=sc.nextInt();
			}
			int min=positions[0][0]-1+positions[0][1]-1;
			
			int num=0;
			for(int i=1;i<traps;i++){
				num=positions[i][0]-1+positions[i][1]-1;
				if(min>num){
					min=num;
				}
			}
			System.out.println(min);
			
		}
		
	}

}

20.腾讯-游戏任务标记

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			int first=sc.nextInt();
			int second=sc.nextInt();
			if(first<1||first>1024||second<1||second>1024){
				System.out.println(-1);
			}else{
				if(first==second){
					System.out.println(1);
				}
				if(first!=second){
					System.out.println(0);
				}
			}
			
			
		}
	}
}

21.美团点评-网格走法数目

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		//获取到网格的长和宽
		int x=sc.nextInt();
		int y=sc.nextInt();
		int[][] f=new int[11][11];
		f[0][0]=0;
		for(int i=0;i<=x;i++){
			f[i][0]=1;
		}
		for(int j=0;j<=y;j++){
			f[0][j]=1;
		}
		for(int i=1;i<=x;i++){
			for(int j=1;j<=y;j++){
				f[i][j]=f[i-1][j]+f[i][j-1];
			}
		}
		System.out.print(f[x][y]);
	}

}

22.去哪儿网-身份证分组

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		String str=sc.nextLine();
		str=str.replace(" ", "");
		
		int len=str.length();
		for(int i=0;i<len;i++){
			if(i==5||i==13){
				System.out.print(str.charAt(i)+" ");
			}else{
				System.out.print(str.charAt(i));
			}
		}
	}
		
}

23.网易-地牢逃脱

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			//得到地牢的行和列
			int n=sc.nextInt();
			int m=sc.nextInt();
			char[][] map=new char[n][m];
			int[][] tar=new int[n][m]; //每个位置的访问标记,如果是1的话表示已经访问
			for(int i=0;i<n;i++){
				String str=sc.next();
				map[i]=str.toCharArray();
			}
			int startx=sc.nextInt();
			int starty=sc.nextInt();
			int k=sc.nextInt();
			int[] stepx=new int[k];
			int[] stepy=new int[k];
			for(int i=0;i<k;i++){
				stepx[i]=sc.nextInt();
				stepy[i]=sc.nextInt();
			}
			//至此,所有输入的参数都接收完毕
			Queue<Integer> xqueue=new LinkedList<>();
			Queue<Integer> yqueue=new LinkedList<>();
			//引入队列是为了遍历到最后不能走为止??
			xqueue.add(startx);
			yqueue.add(starty);
			
			tar[startx][starty]=1; //起始点访问标记,标记为1表示已经访问
			while(!xqueue.isEmpty()&&!yqueue.isEmpty()){
				startx=xqueue.remove();
				starty=yqueue.remove();
				for(int i=0;i<k;i++){
					//如果没有越界的话,即如果没有出了地图的话
					if(startx+stepx[i]<n&&startx+stepx[i]>=0&&starty+stepy[i]<m&&starty+stepy[i]>=0){
						if(tar[startx+stepx[i]][starty+stepy[i]]==0){
							if(map[startx+stepx[i]][starty+stepy[i]]=='.'){
								tar[startx+stepx[i]][starty+stepy[i]]=tar[startx][starty]+1;
								xqueue.add(startx+stepx[i]);
								yqueue.add(starty+stepy[i]);
							}else{
								tar[startx+stepx[i]][starty+stepy[i]]=-1;
							}
						}
					}
				}
			}
			int max=0;
			int getRoad=1;
			for(int i=0;i<n;i++){
				for(int j=0;j<m;j++){
					if(map[i][j]=='.'&&tar[i][j]==0){
						getRoad=0;
					}
					max=Math.max(max, tar[i][j]);
				}
			}
			if(getRoad==0){
				System.out.println(-1);
			}else{
				System.out.println(max-1);
			}
		}
	}

}

24.小米-电话号码分身

import java.util.Scanner;
public class Main {
	public static void minDoppelgangerOfNum(String str){
		//times记录每一个数字出现的次数
		int[] times=new int[10];
		for(int i=0;i<10;i++){
			times[i]=0;
		}
		StringBuilder sb=new StringBuilder(str);
		while(sb.indexOf("Z")!=-1){
			times[0]++;//0
			sb.deleteCharAt(sb.indexOf("Z"));
			sb.deleteCharAt(sb.indexOf("E"));
			sb.deleteCharAt(sb.indexOf("R"));
			sb.deleteCharAt(sb.indexOf("O"));
		}
		while(sb.indexOf("W")!=-1){
			times[2]++;//2
			sb.deleteCharAt(sb.indexOf("T"));
			sb.deleteCharAt(sb.indexOf("W"));
			sb.deleteCharAt(sb.indexOf("O"));
		}
		while(sb.indexOf("U")!=-1){
			times[4]++;//4
			sb.deleteCharAt(sb.indexOf("F"));
			sb.deleteCharAt(sb.indexOf("O"));
			sb.deleteCharAt(sb.indexOf("U"));
			sb.deleteCharAt(sb.indexOf("R"));
		}
		while(sb.indexOf("X")!=-1){
			times[6]++;//6
			sb.deleteCharAt(sb.indexOf("S"));
			sb.deleteCharAt(sb.indexOf("I"));
			sb.deleteCharAt(sb.indexOf("X"));
		}
		while(sb.indexOf("G")!=-1){
			times[8]++;//8
			sb.deleteCharAt(sb.indexOf("E"));
			sb.deleteCharAt(sb.indexOf("I"));
			sb.deleteCharAt(sb.indexOf("G"));
			sb.deleteCharAt(sb.indexOf("H"));
			sb.deleteCharAt(sb.indexOf("T"));
		}
		while(sb.indexOf("O")!=-1){
			times[1]++;//1
			sb.deleteCharAt(sb.indexOf("O"));
			sb.deleteCharAt(sb.indexOf("N"));
			sb.deleteCharAt(sb.indexOf("E"));
		}
		while(sb.indexOf("H")!=-1){
			times[3]++;//3
			sb.deleteCharAt(sb.indexOf("T"));
			sb.deleteCharAt(sb.indexOf("H"));
			sb.deleteCharAt(sb.indexOf("R"));
			sb.deleteCharAt(sb.indexOf("E"));
			sb.deleteCharAt(sb.indexOf("E"));
		}
		while(sb.indexOf("F")!=-1){
			times[5]++;//5
			sb.deleteCharAt(sb.indexOf("F"));
			sb.deleteCharAt(sb.indexOf("I"));
			sb.deleteCharAt(sb.indexOf("V"));
			sb.deleteCharAt(sb.indexOf("E"));
		}
		while(sb.indexOf("S")!=-1){
			times[7]++;//7
			sb.deleteCharAt(sb.indexOf("S"));
			sb.deleteCharAt(sb.indexOf("E"));
			sb.deleteCharAt(sb.indexOf("V"));
			sb.deleteCharAt(sb.indexOf("E"));
			sb.deleteCharAt(sb.indexOf("N"));
		}
		while(sb.indexOf("I")!=-1){
			times[9]++;//9
			sb.deleteCharAt(sb.indexOf("N"));
			sb.deleteCharAt(sb.indexOf("I"));
			sb.deleteCharAt(sb.indexOf("N"));
			sb.deleteCharAt(sb.indexOf("E"));
		}
		//映射:times:str中的数字      cast:对应到电话号码里的数字
		
		int[] cast=new int[10];
		for(int i=0;i<10;i++){
			cast[i]=times[(i+8)%10];
			//System.out.print(cast[i]);
		}
		//得到0-9这10个数字在电话号码里面各自出现的次数	
		//StringBuilder res=new StringBuilder();
		for(int i=0;i<10;i++){
			if(cast[i]==0){
				continue;
			}else{
				for(int j=0;j<cast[i];j++){
					System.out.print(i);
				}
				
			}
		}
		System.out.println();
	}
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();     //获取测试样例个数
		while(n--!=0){
			String str=sc.next();
			//System.out.println(str);
			minDoppelgangerOfNum(str);
		}
		
	}

}

【轴承故障诊断】基于融合鱼鹰和柯西变异的麻雀优化算法OCSSA-VMD-CNN-BILSTM轴承诊断研究【西储学数据】(Matlab代码实现)内容概要:本文提出了一种基于融合鱼鹰和柯西变异的麻雀优化算法(OCSSA)优化变分模态分解(VMD)参数,并结合卷积神经网络(CNN)与双向长短期记忆网络(BiLSTM)的轴承故障诊断模型。该方法利用西储学公开的轴承数据集进行验证,通过OCSSA算法优化VMD的分解层数K和惩罚因子α,有效提升信号分解精度,抑制模态混叠;随后利用CNN提取故障特征的空间信息,BiLSTM捕捉时间序列的动态特征,最终实现高精度的轴承故障分类。整个诊断流程充分结合了信号预处理、智能优化与深度学习的优势,显著提升了复杂工况下轴承故障诊断的准确性与鲁棒性。; 适合人群:具备一定信号处理、机器学习及MATLAB编程基础的研究生、科研人员及从事工业设备故障诊断的工程技术人员。; 使用场景及目标:①应用于旋转机械设备的智能运维与故障预警系统;②为轴承等关键部件的早期故障识别提供高精度诊断方案;③推动智能优化算法与深度学习在工业信号处理领域的融合研究。; 阅读建议:建议读者结合MATLAB代码实现,深入理解OCSSA优化机制、VMD参数选择策略以及CNN-BiLSTM网络结构的设计逻辑,通过复现实验掌握完整诊断流程,并可进一步尝试迁移至其他设备的故障诊断任务中进行验证与优化。
内容概要:本文档《统信服务器操作系统行业版安全加固指导》针对统信UOS(服务器行业版)操作系统,提供了全面的安全配置与加固措施,涵盖身份鉴别、访问控制、安全审计、入侵防范、可信验证和数据传输保密性六方面。文档依据国家等级保护三级标准制定,详细列出了58项具体的安全加固项,包括账户锁定策略、密码复杂度要求、SSH安全配置、日志审计、文件权限控制、系统服务最小化、防止IP欺骗、核心转储禁用等内容,并给出了每项配置的操作命令和检查方法,旨在提升主机系统的整体安全性,满足等保合规要求。; 适合人群:系统管理员、信息安全工程师、运维技术人员以及负责统信UOS服务器部署与安全管理的专业人员;具备一定的Linux操作系统基础知识和安全管理经验者更为适宜。; 使用场景及目标:①用于统信UOS服务器系统的安全基线配置与合规性检查;②指导企业落实网络安全等级保护制度中的主机安全要求;③在系统上线前或安全整改过程中实施安全加固,防范未授权访问、信息泄露、恶意攻击等安全风险;④作为安全审计和技术检查的参考依据。; 阅读建议:建议结合实际生产环境逐步实施各项安全配置,操作前做好系统备份与测试验证,避免影响业务正常运行;同时应定期复查配置有效性,关注系统更新带来的安全策略变化,确保长期符合安全基线要求。
内容概要:本文介绍了基于MATLAB实现的RF-XGBoost混合集成模型,用于多特征分类预测。该模型结合随机森林(RF)与极端梯度提升(XGBoost)的优势,构建多层混合架构:RF作为基础筛选层进行特征重要性评估与降维,XGBoost作为精细建模层进行高阶非线性关系挖掘与残差优化。项目涵盖完整的数据预处理、特征工程、样本均衡、模型训练与评估流程,并提供可视化分析功能,有效应对高维数据、样本不均衡、过拟合等挑战,提升分类准确率与模型泛化能力。文中还给出了部分示例代码与系统设计思路,支持多领域应用扩展。; 适合人群:具备一定机器学习基础,熟悉MATLAB编程,从事数据分析、智能预测相关工作的科研人员、工程师及高师生;适用于工作1-3年希望提升集成学习实战能力的技术人员。; 使用场景及目标:①应用于医疗诊断、金融风控、智能制造等领域中的多特征多类别分类任务;②解决高维数据下的维数灾难、样本不均衡与模型可解释性问题;③构建稳定、高效、可扩展的智能预测分析平台。; 阅读建议:此资源以实际项目为导向,强调理论与实践结合,建议读者在学习过程中动手复现代码,结合MATLAB平台调试模型参数,深入理解RF与XGBoost的融合机制,并尝试在自有数据集上迁移应用,以掌握完整建模流程与优化技巧。
机器人寻宝问题通常可以抽象为在一个二维网格中,机器人从起点出发,寻找宝藏的过程,可能会涉及路径规划、障碍物躲避等问题,一般可以使用广度优先搜索(BFS)、深度优先搜索(DFS)等算法来解决。以下是一个简单的使用广度优先搜索(BFS)算法实现机器人在二维网格中寻找宝藏的 C++ 示例代码: ```cpp #include <iostream> #include <queue> #include <vector> using namespace std; // 定义方向数组,分别表示上、下、左、右 const int dx[] = {-1, 1, 0, 0}; const int dy[] = {0, 0, -1, 1}; // 检查坐标 (x, y) 是否在网格内且不是障碍物 bool isValid(int x, int y, int rows, int cols, const vector<vector<int>>& grid) { return x >= 0 && x < rows && y >= 0 && y < cols && grid[x][y] != 1; } // BFS 函数,返回从起点到宝藏的最短路径长度 int bfs(const vector<vector<int>>& grid, pair<int, int> start, pair<int, int> treasure) { int rows = grid.size(); int cols = grid[0].size(); // 标记数组,记录是否已经访问过某个位置 vector<vector<bool>> visited(rows, vector<bool>(cols, false)); // 队列用于 BFS queue<pair<pair<int, int>, int>> q; // 将起点加入队列 q.push({start, 0}); visited[start.first][start.second] = true; while (!q.empty()) { auto [current, steps] = q.front(); q.pop(); int x = current.first; int y = current.second; // 如果到达宝藏位置,返回步数 if (x == treasure.first && y == treasure.second) { return steps; } // 遍历四个方向 for (int i = 0; i < 4; ++i) { int newX = x + dx[i]; int newY = y + dy[i]; // 检查新位置是否有效且未被访问过 if (isValid(newX, newY, rows, cols, grid) && !visited[newX][newY]) { q.push({{newX, newY}, steps + 1}); visited[newX][newY] = true; } } } // 如果无法到达宝藏位置,返回 -1 return -1; } int main() { // 示例网格,0 表示可通行,1 表示障碍物,2 表示宝藏 vector<vector<int>> grid = { {0, 0, 0}, {0, 1, 0}, {0, 0, 2} }; // 起点和宝藏的位置 pair<int, int> start = {0, 0}; pair<int, int> treasure; // 寻找宝藏的位置 for (int i = 0; i < grid.size(); ++i) { for (int j = 0; j < grid[0].size(); ++j) { if (grid[i][j] == 2) { treasure = {i, j}; break; } } } // 调用 BFS 函数计算最短路径长度 int shortestPath = bfs(grid, start, treasure); if (shortestPath != -1) { cout << "最短路径长度: " << shortestPath << endl; } else { cout << "无法到达宝藏位置" << endl; } return 0; } ``` ### 代码解释: 1. **方向数组**:`dx` 和 `dy` 数组用于表示机器人在二维网格中可以移动的四个方向(上、下、左、右)。 2. **isValid 函数**:用于检查一个坐标是否在网格内且不是障碍物。 3. **bfs 函数**:使用广度优先搜索算法,从起点开始,逐层扩展,直到找到宝藏或队列为空。使用 `visited` 数组记录已经访问过的位置,避免重复访问。 4. **main 函数**:定义了一个示例网格,找到宝藏的位置,调用 `bfs` 函数计算最短路径长度,并输出结果。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值