上海交通大学计算机考研复试 2017年(java)

1、String to int
模仿atoi函数,找出一个字符串第一个int型的数字。
测试用例1:
输入:2016
输出:2016
测试用例2:
输入:000687CS01
输出:687

import java.util.*;
import java.io.*;
import java.text.* ;
import java.math.*;
public class Main
{
	static HashMap<String, Integer> map;
	static boolean[] visited;
	static int len;
	static int k;
    public static void main(String[] args){
    	try {
	        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
	        String str = br.readLine();
        	char[] ch = str.toCharArray();
        	StringBuilder sb = new StringBuilder();
        	int n = ch.length;
        	int i = 0;
        	for(; i < n; i++) {
        		if(ch[i] > '0' && ch[i] <= '9') {
        			sb.append(ch[i]);
        			break;
        		}
        	}
        	if(i == n) System.out.println("NULL");
        	else {
        		for(int j = i+1; j < n; j++) {
            		if(ch[j] >= '0' && ch[j] <= '9') {
            			sb.append(ch[j]);
            		}
            		else break;
        		}
        		System.out.println(sb);
        	}
 	    } catch (IOException e) {
	        e.printStackTrace();
	    }
    }
}


2、ZIG-ZAG
寻找一个序列的最长之字形的长度。如1 5 3 6 1的长度为5,1 3 5的长度为2.
序列长度不超过50,数字不超过1000
第一行输入n,表示序列长度
第二行出入序列
测试用例1:
输入:
1
44
输出:
1
测试用例2:
输入:
5
1 5 3 6 1
输出:
5

import java.util.*;
import java.io.*;
import java.text.* ;
import java.math.*;
public class Main
{
    public static void main(String[] args){
    	try {
	        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
	        int n = Integer.parseInt(br.readLine());
	        String[] parts = br.readLine().split(" ");
	        System.out.println(getRes(n, parts));
 	    } catch (IOException e) {
	        e.printStackTrace();
	    }
    }
    public static int getRes(int n, String[] parts) {
    	if(n == 1) return 1;
    	int[] nums = new int[n];
    	for(int i = 0; i < n; i++) {
    		nums[i] = Integer.parseInt(parts[i]);
    	}
    	boolean mark;
    	if(nums[1] > nums[0]) mark = true;
    	else mark = false;
    	int[] len = new int[n];
    	len[1] = 2;
    	for(int i = 2; i < n; i++) {
    		if((mark&&(nums[i]>=nums[i-1]))||(!mark&&(nums[i]<=nums[i-1]))) {
    			len[i] = 2;
    			continue;
    		}
    		len[i] = len[i-1]+1;
    		if(mark&&(nums[i]<nums[i-1])) mark = false;
    		else mark = true;
    	}
    	int max = 0;
    	for(int i = 0; i < n; i++) {
    		if(len[i] > max) max = len[i];
    	}
    	return max;
    }
}


3、Sum of Fibonacci
求一个数字用斐波那契数列的数字表示的方法的数量。
规定F(1)=1,F(2)=2;
如13可以表示为
13=13
13=5+8
13=2+3+8
但不可以是13=2+3+3+5 因为有了重复的
有三种
测试用例1:
输入:6
输出:2
测试用例2:
输入:8
输出:3

import java.util.*;
import java.io.*;
import java.text.* ;
import java.math.*;
public class Main
{
	static boolean[] visited;
	static int res = 0;
    public static void main(String[] args){
    	try {
	        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
	        int sum = Integer.parseInt(br.readLine());
	        ArrayList<Integer> fib = new ArrayList<>();
	        fib.add(1);
	        int fib1 = 1;
	        int fib2 = 2;
	        int num = 2;
	        while(num <= sum) {
	        	fib.add(num);
	        	num = fib1+fib2;
	        	fib1 = fib2;
	        	fib2 = num;
	        }
	        visited = new boolean[fib.size()];
	        backtrack(sum, fib, 0);
	        System.out.println(res);
 	    } catch (IOException e) {
	        e.printStackTrace();
	    }
    }
    public static void backtrack(int sum, ArrayList<Integer> fib, int begin) {
    	if(sum == 0) {
    		res++;
    		return;
    	}
    	if(sum < 0) return;
    	for(int i = begin; i < fib.size(); i++) {
    		if(visited[i]) continue;
    		visited[i] = true;
    		backtrack(sum-fib.get(i), fib, i+1);
    		visited[i] = false;
    	}
    }
}


发布了332 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43306331/article/details/105126913
今日推荐