腾讯笔试题

package com.zte.array;

import java.util.Arrays;
import java.util.Stack;

public class Main1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// System.out.println(uncompress("HG[3|B[2|CA]]F"));
		// String str2 = "123";
		// System.out.println(str2.substring(1, 3));
		// int n = 6;
		// int arr[] = { 5, 3, 8, 3, 2, 5 };
		// seenNums(n, arr);
		// int[] arr = { 1, 3, 4, 2 };
		// int arr1[] = getReverse(arr, 1);
		// for (int i = 0; i < arr1.length; i++) {
		// System.out.println(arr1[i]);
		// }
		// int[] arr = { -1, -2, -3 };
		// System.out.println(sum(8, 2));
		// int[] arr = { 2, 7, 4 };
		// System.out.println(describe(3, arr));
		// System.out.println(max(3, 7));
		// System.out.println(select(5, 3));
		System.out.println(kinds(5, 2, 3, 3, 3));
	}

	public static String uncompress(String str1) {
		Stack st = new Stack<>();
		StringBuilder res = new StringBuilder();
		int right = 0;
		for (char c : str1.toCharArray()) {
			res.append(c);
			if (c == '[' || c == '|')
				st.push(right);
			if (c == ']') {
				if (st.size() >= 2) {// 此处判断下是否栈内存有'['和'|',防止输入有误导致异常
					int k1 = st.pop();
					int left = st.pop();
					String s1 = res.substring(k1 + 1, right);// 获取'|'和']'之前的字符串
					int num = Integer.parseInt(res.substring(left + 1, k1));// 获取'['后的数字
					StringBuilder str = new StringBuilder();// 涉及到字符串拼接,用StringBuilder效率高
					for (int j = 0; j < num; j++)
						str.append(s1);
					res = res.replace(left, right + 1, str.toString());
					right = left + str.length() - 1;// 重新定位right的位置
				} else {
					System.out.println("");
					break;
				}
			}
			right++;
		}
		if (!st.isEmpty())
			System.out.println("");// 栈内不为空,则符号不匹配,不能返回正确结果
		return res.toString();
	}

	public static void seenNums(int n, int arr[]) {
		int[] array = new int[n];
		for (int j = 0; j < n; j++) {
			int leftmax = 0;
			int rightmax = 0;
			int i = 0;
			if (j == 0 || j == n - 1) {
				i = 1;
			} else {
				i = 3;
				leftmax = arr[j - 1];
				rightmax = arr[j + 1];
			}
			for (int k = j; k >= 0; k--) {
				if (j != k && arr[k] > leftmax) {
					leftmax = arr[k];
					i++;
				}
			}
			for (int k = j; k < n; k++) {
				if (j != k && arr[k] > rightmax) {
					rightmax = arr[k];
					i++;
				}
			}
			array[j] = i;
		}
		for (int i = 0; i < n; i++) {
			System.out.print(array[i] + " ");
		}
	}

	// 返回旋转数组 2 1 4 3
	public static int[] getReverse(int arr[], int n) {
		int array[] = new int[arr.length];
		for (int i = 0; i < arr.length; i++) {
			if ((i + n) < arr.length)
				array[i] = arr[i + n];
			else {
				array[i] = arr[i + n - arr.length];
			}
		}
		return array;

	}

	// 逆序对
	public static int reverseNums(int[] arr) {
		int sum = 0;
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[i] > arr[j])
					sum++;
			}
		}
		System.out.println(sum);
		return sum;
	}

	// 2的n次方
	public static int nn(int n) {
		if (n == 1)
			return 2;
		else {
			return 2 * nn(n - 1);
		}
	}

	public static int min(int[][] arr, int n, int L) {

		return -1;

	}

	// 向上取整用Math.ceil(double a)
	// 向下取整用Math.floor(double a)
	public static int sum(int n, int m) {
		int sum = 0;
		int j = 0;
		for (int i = 1; i < n + 1; i++) {
			if (i % m != 0)
				j = (i / m) + 1;
			else
				j = i / m;
			if (j % m == 0) {
				sum += (i + 1);
			} else
				sum += -(i + 1);
		}
		return sum;

	}

	public static int describe(int n, int[] arr) {
		Arrays.sort(arr);
		int sum1 = 0;
		int sum2 = 0;
		int sum = 0;
		for (int i = n - 1; i >= 0; i = i - 2) {
			sum1 += arr[i];
			if ((i - 1) >= 0)
				sum2 += arr[i - 1];
		}
		sum = Math.abs(sum1 - sum2);
		return sum;

	}

	public static int max(int n, int m) {
		int sum = 0;
		for (int i = 1; i < n; i++)
			sum += i * 1;
		sum = m - sum;
		return sum;

	}

	public static int kinds(int l, int alen, int a, int blen, int b) {
		int sum = 0;
		if (alen > l && b > alen)
			return -1;
		if (l % alen == 0) {
			sum += select(a, l / alen);
		}
		if (l % blen == 0) {
			sum += select(b, l / blen);
		}
		if (l % (alen + blen) == 0) {
			int selecta = 0;
			int selectb = 0;
			int loss = 0;
			for (int i = 1; i < (l / alen); i++) {
				loss = (l - i * alen) / blen;
				selecta = select(a, i);
				selectb = select(b, loss);
				sum = sum + selecta * selectb;
			}
		}

		return sum%1000000007;

	}

	public static int select1() {
		return 0;

	}

	public static int select(int sum, int n) {
		int sum1 = 1;
		int k = 0;
		for (int i = 1; i < n + 1; i++) {
			sum1 *= sum;
			sum--;
		}
		k = nnnn(n);
		return sum1 / k;

	}

	public static int nnnn(int n) {
		int sum = 1;
		while (n != 0) {
			sum = sum * n;
			n--;
		}
		return sum;
	}

}

 

你可能感兴趣的:(剑指offer)