2021秋招笔试编程题记录(待更新)

因为有些公司的笔试题是保密的,所以下面不会给出题目具体来源。

 
 

1.String A 和 String B代表两行输入记录,'#'代表后退键,若A和B代表的字符串一致返回相同字符串,不一致返回两个字符串。

From:某运营商子公司

public class Solution {
	public String[] StrCmp(String A,String B) {
		String[] res = new String[2];
		StringBuilder sb = new StringBuilder(Math.max(A.length(), B.length()));
		for(int i=0;i<A.length();i++)
			if(A.charAt(i)!='#')
				sb.append(A.substring(i,i+1));
			else if(sb.length()!=0)
				sb.deleteCharAt(sb.length()-1);
		res[0] = sb.toString();
		sb.replace(0, sb.capacity(), "");
		for(int i=0;i<B.length();i++)
			if(B.charAt(i)!='#')
				sb.append(B.substring(i,i+1));
			else if(sb.length()!=0)
				sb.deleteCharAt(sb.length()-1);
		res[1] = sb.toString().equals(res[0])?" ":sb.toString();
		return res;
	}
	
    public static void main(String[] args) {
    	Solution sn = new Solution();
    	String A="#A33##ppll#ed",B="#R##Appd34###le";
    	String[] res = sn.StrCmp(A, B);
    	System.out.println(res[0]);
    	if(!res[1].equals(" "))
    		System.out.println(res[1]);
    }
}

 

2.T输入测试样例次数;N、M分别输入屏幕键盘纵横比;输入键盘布局;输入要打印的字符串;输出光标移动次数+确认次数。

说明:光标开始位于左上角,每找到一个字符要确认一次,录入的键盘除了_外其他字符不会重复。

例如:

1
3 3
__A
MR_
DC_
ACM

输出结果:10

From:某国行子公司

public class Solution {
	//因为nextInt输入会遗留换行符所以要额外读取\n
	
    public static void main(String[] args) {
    	//Solution sn = new Solution();
    	@SuppressWarnings("resource")
	Scanner sc = new Scanner(System.in);
        int t=sc.nextInt(),n,m;sc.nextLine();
        while(t-- != 0) {
            n=sc.nextInt();m=sc.nextInt();sc.nextLine();
            Map<Character,Integer> mp = new HashMap<>();
            int[][] pos = new int[m*n][2];
            int p=0;    //数组下标
            for(int i=0;i<n;i++) {
            	String tmp = sc.nextLine();
            	for(int j=0;j<m;j++) {
            		char c=tmp.charAt(j);
            		if(c != '_') {
            			pos[p][0]=i;pos[p][1]=j;
            			mp.put(c, p++);
            		}
            	}
            }
            String str = sc.nextLine();
            int a=0,b=0,step=0;
            for(int i=0;i<str.length();i++) {
            	p = mp.get(str.charAt(i));
            	int dist = Math.abs(pos[p][0]-a)+Math.abs(pos[p][1]-b);
            	a=pos[p][0];b=pos[p][1];
            	step += dist;
            }
            System.out.println(step+str.length());
        }
    }
}

 

3.模拟LRU页面置换算法,输入页面队列的size和页面读入次数;依次输入页面的编号;输出缺页次数。

例如:

4 9
1 2 2 5 9 1 3 2 5
7

相似题:模拟FIFO页面置换算法

From:某国行子公司

public class Solution {
	//remove和poll的区别,尽可能不用add
	
    @SuppressWarnings("resource")
	public static void main(String[] args) {
    	//Solution sn = new Solution();
    	Scanner sc = new Scanner(System.in);
    	int size=sc.nextInt(),n=sc.nextInt(),absent=0;sc.nextLine();
    	int[] pid = new int[n];
    	for(int i=0;i<n;i++)
    		pid[i] = sc.nextInt();
    	Queue<Integer> page = new LinkedList<>();
    	for(int i:pid) {
    		if(page.contains(i)) {
    			page.remove(i);
    			page.offer(i);
    			continue;
    		}
    		if(page.size() != size)
    			page.offer(i);
    		else {
    			page.poll();
    			page.offer(i);
    		}
    		absent++;
    	}
        System.out.println(absent);
    }
}

 

待更新。。。

posted @ 2021-09-26 18:06  梵蒂冈宝石  阅读(97)  评论(0编辑  收藏  举报