【好未来】2017好未来(最后一道题典型dfs,n个数和为m)

题目描述

读入一个字符串str,输出字符串str中的连续最长的数字串

输入描述:

个测试输入包含1个测试用例,一个字符串str,长度不超过255。

输出描述:

在一行内输出str中里连续最长的数字串。

示例1

输入

复制

abcd12345ed125ss123456789

输出

复制

123456789
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		String str = cin.nextLine();
		char[] arr = str.toCharArray();
		int begin = 0, end = begin + 1;
		//记住下标
		int start=begin,fin=end;
		int max = 0, dis = 0;
		while (end < arr.length && begin < end) {
			int i = begin;
			while (((int) arr[end] - (int) arr[i] == 1)&&(i<arr.length-1)&&(end<arr.length)) {
				end++;
				i++;
				//末尾可能溢出
				if(end==arr.length-1){
					if((int) arr[end] - (int) arr[i] == 1){
						end=arr.length;
						break;
					}
				}
			}
			
			
			
			end=end-1;
			dis = end - begin+1;
			max = Math.max(dis, max);
			//记住下标
			if(max==dis){
				start=begin;
				fin=end;
			}
			begin = end+1;
			end = begin + 1;

		}
		System.out.println(str.substring(start,fin+1));
	}
}

注意while循环末尾容易溢出,需要做判断

优化之后的代码,不用再判断末尾。开始忘了记录连续子串开始的位置,用i记住。

简单题应该更快更好做完!

package suanfaA;

import java.util.*;

public class test {
	public static void main(String[] args) {
		lianxu();
	}
	public static void lianxu() {
		Scanner scanner=new Scanner(System.in);
		String test=scanner.nextLine();
		char []arr=test.toCharArray();
		int maxlength=Integer.MIN_VALUE;
		int begin=0,end=begin+1;
		int eindex=0;
		while(end<arr.length&&begin<end){
			//把begin起始的位置 
			int i=begin;
			while(end<arr.length&&begin<arr.length&&arr[end]-arr[begin]==1){
				begin++;
				end++;
			}
			//记下最长的距离
			maxlength=Math.max(maxlength, end-i);
			//记下坐标
			if(maxlength==end-i){
				eindex=end;
			}
			begin=end;
			end=end+1;
		}
		System.out.println(test.substring(eindex-maxlength, eindex));
	}

}

 

 

题目描述

找出n个数里最小的k个

输入描述:

每个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n
不超过100。

输出描述:

输出n个整数里最小的k个数。升序输出

示例1

输入

复制

3 9 6 8 -10 7 -11 19 30 12 23 5

输出

复制

-11 -10 3 6 7
  •  
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		String str = cin.nextLine().toString();
		String b[] = str.split(" ");
		ArrayList<Integer> list = new ArrayList<>();

		for (int i = 0; i < b.length ; i++) {
			list.add(Integer.parseInt(b[i]));
		}
		int num = list.get(list.size() - 1);
		list.remove(list.get(list.size() - 1));
		Collections.sort(list);

		for (int i = 0; i < num; i++) {
			System.out.print(list.get(i)+" ");
		}

	}
}

 

 

 

 

题目描述

输入n个整数,输出出现次数大于等于数组长度一半的数。

输入描述:

每个测试输入包含 n个空格分割的n个整数,n不超过100,其中有一个整数出现次数大于等于n/2。

输出描述:

输出出现次数大于等于n/2的数。

示例1

输入

复制

3 9 3 2 5 6 7 3 2 3 3 3

输出

复制

3
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String str=sc.nextLine();
		String []arrStr=str.split(" ");
		int []arr=new int[arrStr.length];
		for(int i=0;i<arrStr.length;i++){
			arr[i]=Integer.parseInt(arrStr[i]);
		}
		
		int []count=new int[100];
		for(int i=0;i<arr.length;i++){
			count[arr[i]]++;
		}
		int pos=0;
		for(int i=0;i<count.length;i++){
			if(count[i]>=arr.length>>1){
				pos=i;
				break;
			}
		}
		System.out.println(pos);
		
	}
}

 

 

 

题目描述

将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I

输入描述:

每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100

输出描述:

依次输出倒置之后的字符串,以空格分割

示例1

输入

复制

I like beijing.

输出

复制

beijing. like I
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		//倒置字符串
		Scanner sc=new Scanner(System.in);
		String str=sc.nextLine();
		String[]arr=str.split(" ");
		String temp="";
		for(int i=0;i<arr.length/2;i++){
			temp=arr[i];
			arr[i]=arr[arr.length-i-1];
			arr[arr.length-i-1]=temp;
		}
		for(int i=0;i<arr.length-1;i++){
			System.out.print(arr[i]+" ");
		}
		System.out.print(arr[arr.length-1]);
	}
}

 

 

题目描述

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

输入描述:

每个测试输入包含2个字符串

输出描述:

输出删除后的字符串

示例1

输入

复制

They are students. aeiou

输出

复制

Thy r stdnts.
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while (sc.hasNext()){
			String str=sc.nextLine();
			String delete=sc.nextLine();
			
			char []array=delete.toCharArray();
			for(int i=0;i<array.length;i++){
				str=str.replaceAll(String.valueOf(array[i]), "");
			}
			System.out.println(str);
			
		}

	}
}

 

 

 

回溯法!!时隔三个月自己搞明白,重点重点!!!

输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来

输入描述:

每个测试输入包含2个整数,n和m

输出描述:

按每个组合的字典序排列输出,每行输出一种组合

示例1

输入

复制

5 5

输出

复制

1 4
2 3
5
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

	static ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
	static ArrayList<Integer> list = new ArrayList<>();

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int N = sc.nextInt();
			int M = sc.nextInt();
			// 从数列1,2,3.......n 中随意取几个数,使其和等于 m
			dfs(1, M, N);
			for (ArrayList<Integer> l : res) {
				int i = 0;
				for (; i < l.size() - 1; i++) {
					System.out.print(l.get(i) + " ");

				}
				System.out.println(l.get(i));
			}
		}

	}

	public static void dfs(int index, int count, int n) {
		if (count == 0) {
			res.add(new ArrayList<>(list));
		} else {
			for (int i = index; i <= count && i <= n; i++) {
				list.add(i);
				dfs(i + 1, count - i, n);
				list.remove(list.size() - 1);
				
			}
		}
	}
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值