【ForOffer】【深信服--测试开发岗笔试题】求最少车费&求最低位&找马甲&找字符串子串

这篇博客总结了深信服笔试中四道常见的编程题,包括求最低位、最少车费、字符串子串和找马甲。题目虽有变形,但核心思路清晰,涉及二进制操作、动态规划、字符串处理和哈希映射。博主分享了解题思路,代码可以直接应用,但可能非最优解法。

深信服的整体笔试题难度一般,有多刷题的经验,能立马找出了题意理解,在此,自己只是做个总结发出,有更好的解法的童靴可以一起交流,其实这四道题都是常见题型的一种变形。代码照着搬都是没有问题的哦!

 

第一题:求最低位

 关键点说明:主要是对二进制转换,并且截取到了从右到左第一个1位置。思路简单吧!

package com.Mukvin.ShenXinFu;

import java.util.ArrayList;
import java.util.Scanner;

public class 求最低位 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String string = "" ;
		ArrayList<String> arrayList = new ArrayList<>();
		while(!(string = scanner.nextLine()).equals("0")) {
			arrayList.add(string);
		}
		ArrayList<Integer> res = getResFormStr(arrayList);
		for (int i = 0; i < res.size(); i++) {
			System.out.println(res.get(i));
		}
		scanner.close();
	}

	private static ArrayList<Integer> getResFormStr(ArrayList<String> arrayList) {
		ArrayList<Integer> temp = new ArrayList<>();
		
		for (int i = 0; i < arrayList.size(); i++) {
			String erjinzhi = getErJ(Integer.parseInt(arrayList.get(i)));
			//System.out.println(erjinzhi);
			String subMin = getSubMinBinary(erjinzhi);
			//System.out.println(subMin);
			//int res = binToTen();
			//System.out.println(Integer.parseInt(subMin, 2));
			temp.add(Integer.parseInt(subMin, 2));
		}
		return temp;
	}

	private static String getSubMinBinary(String erjinzhi) {
		int len = erjinzhi.length();
		char[] lastIndex = erjinzhi.toCharArray();
		int index = 0;
		for (int i = len-1; i >=0; i--) {
			if (lastIndex[i] == '1') {
				index = i;
				break;
			}else {
				continue;
			}
		}
		return erjinzhi.substring(index);
	}

	private static String getErJ(int num) {
		String string= "";
		while(num!=0) {
			string = num%2+string;
			num=num/2;
		}
		return string;
	}

}

第二题:最少车费

如果做过题的同学肯定能一眼就看出了这个题目,其实出题者只是变了个表述,连的其中的基础数据都是没有变的,也就是常规的动态规划的题目。

package com.Mukvin.ShenXinFu;

import java.util.Scanner;

public class 最小车费 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int[][] matrix = new int[4][4];
		for (int i = 0; i < matrix.length; i++) {
			for (int j = 0; j < matrix[0].length; j++) {
				matrix[i][j] =scanner.nextInt();
			}
		}
		int minFee = getMinPath(matrix);
		System.out.println(minFee);
		scanner.close();
	}

	private static int getMinPath(int[][] matrix) {
		if (matrix == null || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0) {
			return 0;
		}
		int row = matrix.length;
		int col = matrix[0].length;
		int[][] dp = new int[row][col];
		dp[0][0] = matrix[0][0];
		for (int i = 1; i < row; i++) {
			dp[i][0] = dp[i - 1][0] + matrix[i][0];
		}
		for (int j = 1; j < col; j++) {
			dp[0][j] = dp[0][j - 1] + matrix[0][j];
		}
		for (int i = 1; i < row; i++) {
			for (int j = 1; j < col; j++) {
				dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + matrix[i][j];
			}
		}
		return dp[row - 1][col - 1];
	}
}

 第三题:字符串子串

 

该题主要注意一个点就是,其中如果重复了的话,要去掉,注意看有两个bb哦!

package com.Mukvin.ShenXinFu;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

public class 字符串子串 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String string = scanner.nextLine();
		ArrayList<String> reStrings = getSubStr(string);
		if (reStrings.isEmpty() || reStrings == null) {
			System.out.println(0);
			return;
		}
		HashMap<String, Integer> hashMap = new HashMap<>();
		for (int i = 0; i < reStrings.size(); i++) {
			if (hashMap.containsKey(reStrings.get(i))) {
				continue;
			}else {
				hashMap.put(reStrings.get(i), 1);
				System.out.print(reStrings.get(i)+" ");
			}
		}
		scanner.close();
	}

	private static ArrayList<String> getSubStr(String string) {
		ArrayList<String> arrayList = new ArrayList<>();
		char[] charArr = string.toCharArray();
		for (int i = 0; i < charArr.length; i++) {
			if (!(charArr[i]>='a' && charArr[i]<='z')) {
				return arrayList;
			}
		}
		int index = 1;
		for (int i = 0; i < charArr.length; i++) {
			char tempChar = charArr[i];
			if (i+1 < charArr.length && tempChar == charArr[i+1] ) {
				++index;
			}else {
				arrayList.add(String.valueOf(index+""+tempChar));
				index = 1;
			}
		}
		
		return arrayList;
	}

}

第四题:找马甲

该题的主要思路就是映射问题,看到映射,那不得把hashmap好好用起来!

package com.Mukvin.ShenXinFu;

import java.util.*;
import java.util.Map.Entry;
public class 找马甲 {

	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		while(n!=0){
			String str[][]=new String [n][2];
			for(int i=0;i<n;i++){
				for(int j=0;j<2;j++){
					str[i][j]=scanner.next();
				}
			}
			pup(str);
			n=scanner.nextInt();
		}
		scanner.close();
	}
	public static void pup(String str[][]){
		int n=str.length;
		String s[][]=new String [n][2];
		HashMap<String ,String> map=new HashMap<String ,String>();
		for(int i=0;i<n;i++){
			if(!map.containsKey(str[i][1])){
				map.put(str[i][1], str[i][0]);
			}else{
				s[i][0]=map.get(str[i][1]);
				s[i][1]=str[i][0];
			}
		}
		TreeMap<String,String> tmap=new TreeMap<String,String>();
		for(int i=0;i<s.length;i++){
			if(s[i][0]!=null){
				tmap.put(s[i][0], s[i][1]);
			}
		}
		
		Iterator<?> iterator=tmap.entrySet().iterator();
		while(iterator.hasNext()){
			@SuppressWarnings("unchecked")
			Map.Entry<String, String> entry=(Entry<String, String>) iterator.next();
			System.out.println(entry.getValue()+" is the MaJia of "+entry.getKey());
		}
		System.out.println("over");
	}
}

 以上,就是这四道题的总结和回答~时间和空间复杂度可能不是最优的,但是思路却是最直接明了的!

该博文 为博主原创,如有转载请注明出处,否则谢绝转载。博文地址:https://blog.youkuaiyun.com/mukvintt/article/details/82852181

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值