自己做的一些题 , 持续更新

package com.review.j2se;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

	public static void main(String[] argv) throws Exception {

		parseToBinary();
	}

	/**
	 * 正则提取参数
	 */
	public static void test2() {

		String str = "218.4.60.214 passport.99fund.com - [23/Aug/2011:15:10:34 +0800] \"GET /servlet/buildimageservlet HTTP/1.1\" 200 1342 \"https://trade.99fund.com/index.jsp?utm_source=n100821020\" \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; znwb6300)\" \"JSESSIONID1=TTRHgwnrpvThlbtlGGW0Wv6kc6JrLGnGDGHnJhPnvZJLHDn34w44!-1839838299; utm_source=n110729001; sso_cookie=%2FaeNSbZlrc3ovm0HMv1NPQcsP43VuHZqd0Y6qDkNRsOpLcxna2btP%2BwMDUMXZl8o; ec_custid=3041221\"";
		Pattern pattern1 = Pattern.compile("\\[.*?\\]");
		Pattern pattern2 = Pattern.compile("utm_source=\\w*");
		Pattern pattern3 = Pattern.compile("ec_custid=\\w*");
		Matcher matcher = pattern1.matcher(str);
		if (matcher.find()) {
			System.out.println(matcher.group());
		}
		matcher = pattern2.matcher(str);
		if (matcher.find()) {
			System.out.println(matcher.group());
		}
		matcher = pattern3.matcher(str);
		if (matcher.find()) {
			System.out.println(matcher.group());
		}
	}

	/**
	 * 有5对IP地址,要求计算出这5对IP地址是否有交集。
	 */
	public static void intersectionProblem() throws Exception {

		List<String> list = new ArrayList<String>();
		list.add("192.168.1.3-192.168.1.5");
		list.add("192.168.1.1-192.168.1.2");
		list.add("192.168.1.1-192.168.1.3");

		for (int i = 0; i < list.size() - 1; i++) {
			for (int j = i + 1; j < list.size(); j++) {
				String ips1 = list.get(i);
				String ips2 = list.get(j);
				boolean result = compareIps(ips1, ips2);
				if (result) {
					System.out.println(ips1 + " 和 " + ips2 + " 有交集");
				} else {
					System.out.println(ips1 + " 和 " + ips2 + " 没有交集");
				}
			}
		}
	}

	// 比较两组ip是否有交集
	private static boolean compareIps(String ips1, String ips2) {

		String[] array1 = ips1.split("-");
		String[] array2 = ips2.split("-");
		if (compareIp(array1[0], array2[0]) >= 0 && compareIp(array1[0], array2[1]) <= 0) {
			return true;
		} else if (compareIp(array1[1], array2[0]) >= 0 && compareIp(array1[1], array2[1]) <= 0) {
			return true;
		}
		return false;
	}

	// 比较两个ip , 如果前者比后者大 , 则返回正数
	private static int compareIp(String ip1, String ip2) {

		String[] array1 = ip1.split("\\.");
		String[] array2 = ip2.split("\\.");
		for (int i = 0; i < 4; i++) {
			int i1 = Integer.parseInt(array1[i]);
			int i2 = Integer.parseInt(array2[i]);
			if (i1 > i2) {
				return 1;
			} else if (i1 < i2) {
				return -1;
			}
		}
		return 0;
	}

	/**
	 * 一个农夫养了一头牛,三年后,这头牛每年会生出1头牛,生出来的牛三年后,又可以每年生出一头牛……问农夫10年后有多少头牛?n年呢?(用JAVA实现)
	 */
	public static void cattleProblem() {

		List<Integer> list = new LinkedList<Integer>();
		list.add(0);
		int year = 10;
		for (int i = 0; i < year; i++) {
			int len = list.size();
			for (int j = 0; j < len; j++) {
				int age = list.get(j) + 1;
				list.set(j, age);
				if (age > 2)
					list.add(0);
			}
		}
		System.out.println(list.size());
	}

	/**
	 * 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求: "4 "不能在第三位, "3 "与 "5 "不能相连. 
	 */
	public static void test() {

		String str = "122345";
		TreeSet<String> results = new TreeSet<String>();

		testImpl(str, "", results);
		for (String result : results) {
			System.out.println(result);
		}
		System.out.println("总数为:" + results.size());
	}

	public static void testImpl(String arg, String str, TreeSet<String> results) {

		if (arg.length() > 0) {
			for (int i = 0; i < arg.length(); i++) {
				String temp = arg.substring(0, i) + arg.substring(i + 1);
				String temp2 = str + arg.charAt(i);
				testImpl(temp, temp2, results);
			}
		} else {
			if (str.charAt(3) != '4' && !str.contains("35") && !str.contains("53"))
				results.add(str);
		}
	}

	/**
	 *计算趋于无穷大的数的余数 
	 */
	public static void remain() {

		String str = "5673454322654648748998323211231231231231231231231231232145668127348612734128637423123";

		int remainder = 0;

		for (int i = 0; i < str.length(); i += 8) {
			String temp;
			if (i + 8 < str.length()) {
				temp = str.substring(i, i + 8);
			} else {
				temp = str.substring(i);
			}
			remainder = Integer.parseInt(remainder + temp) % 7;
		}

		System.out.println(str);
		System.out.println("除以7的余数为" + remainder);
	}

	/**
	 * 100匹马背100担粮。 大马一匹背3担,中马一匹背2担。小马2匹背一担。请编程输出所有满足条件的情况
	 * 6i+4j+k = 200
	 * i+j+k = 100
	 * 相减得出 
	 * 5i + 3j = 100
	 * k = 100 - i - j; 
	 *  求所有 ijk的组合
	 */
	public static void horseTest() {

		for (int i = 0; i <= 20; i++) {
			int j = (100 - i * 5) / 3;
			int k = 100 - i - j;

			if (i * 3 + j * 2 + k * 0.5 == 100)
				System.out.println("i:" + i + "\tj:" + j + "\tk:" + k);
		}

	}

	/**
	 * 编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数,然后打印出这个十进制整数对应的二进制形式。
	 * 这个程序要考虑输入的字符串不能转换成一个十进制整数的情况,并对转换失败的原因要区分出是数字太大,还是其中包含有非数字字符的情况。
	 */
	public static void parseToBinary() throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = "";
		try {
			str = br.readLine();
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (!Pattern.matches(("[0-9]*"), str)) {
			throw new Exception("不是数字");
		}

		int i = 0;
		try {
			i = Integer.parseInt(str);
		} catch (NumberFormatException e) {
			throw new Exception("数字范围太大或者太小");
		}

		System.out.println(Integer.toBinaryString(i));
	}

	/**
	 * 请在一个类中编写一个方法,这个方法搜索一个字符数组中是否存在某个字符,如果存在,则返回这个字符在字符数组中第一次出现的位置(序号从0开始计算),否则,返回-1。
	 * 要搜索的字符数组和字符都以参数形式传递传递给该方法,如果传入的数组为null,应抛出IllegalArgumentException异常。
	 * 在类的main方法中以各种可能出现的情况测试验证该方法编写得是否正确,例如,字符不存在,字符存在,传入的数组为null等。  
	 */
	public static int search(String[] array, String target) {

		if (null == array) {
			throw new IllegalArgumentException();
		}

		for (int i = 0; i < array.length; i++) {
			if (array[i] == target)
				return i;
		}

		return -1;

	}

	/**
	 * 排序, 微软面试题
	 */
	public static void testSort() {

		String[] strs = new String[] { "Bc", "Ad", "Ada", "aC", "Hello", "X man", "little", "During", "day" };
		Arrays.sort(strs, new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {

				int len = o1.length() > o2.length() ? o2.length() : o1.length();
				for (int i = 0; i < len; i++) {
					byte b1 = o1.getBytes()[i];
					byte b2 = o2.getBytes()[i];

					if (b1 - b2 == 32) {
						return 1;
					} else if (b2 - b1 == 32) {
						return -1;
					}

					if (b1 > 96 && b1 < 123) {
						b1 -= 32;
					}
					if (b2 > 96 && b2 < 123) {
						b2 -= 32;
					}
					if (b1 != b2) {
						return b1 - b2;
					}
				}
				return 0;
			}
		});
		System.out.println(Arrays.toString(strs));
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值