1、括号匹配问题
题目
问题描述
由1对括号,可以组成一种合法括号序列:()。
由2对括号,可以组成两种合法括号序列:()()、(())。
由4对括号组成的合法括号序列一共有多少种?
思路:
public class Kuohao {
static int count=0,n=2;
public static void main(String[] args) {
f(0,0);
System.out.println(count);
}
private static void f(int left,int right) {
if(left==n) {
count++;
return;
}
f(left+1,right);
if(left>right)
{
f(left,right+1);
}
}
}
import java.util.Scanner;
import java.util.Stack;
public class Kuohao {
public static void main(String[] args) {
System.out.println(isValid("[])"));
System.out.println(isValid(""));
System.out.println(isValid("(]"));
System.out.println(isValid("(([]){})"));
System.out.println(isValid("([)]"));
System.out.println(isValid("[({(())}[()])]"));
}
public static boolean isValid(String s) {
Stack<Character> st = new Stack<Character>();
for(int i=0;i < s.length();i++){
char temp = s.charAt(i);
switch (temp){
case '(':
st.push(temp);
break;
case '[':
st.push(temp);
break;
case '{':
st.push(temp);
break;
case ')':
if(!st.empty() && st.peek() == '(')
st.pop();
else
return false;
break;
case ']':
if(!st.empty() && st.peek() == '[')
st.pop();
else
return false;
break;
case '}':
if(!st.empty() && st.peek() == '{')
st.pop();
else
return false;
break;
}
//System.out.println(st.toString());
}
if(st.isEmpty())
return true;
else
return false;
}
}
2、无向连通图最少包含多少条边
一个包含有2019个结点的无向连通图,最少包含多少条边?
有n个顶点的无向连通图最多有n(n-1)/2条边,最少有n-1条边。
3、字母重新排列
将LANQIAO中的字母重新排列,可以得到不同的单词,如LANQIAO、AAILNOQ等,注意这7个字母都要被用上,单词不一定有具体的英文意义。
请问,总共能排列如多少个不同的单词。
全排列个数:长度*(长度-1)*(长度-2)。。。1
有一个重复的A,所以要除以2,结果是:2520
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class Pailie {
public static int count=0;
public static ArrayList<Integer> list=new ArrayList<Integer>();
public static Set<String> set=new HashSet<String>();
static String[] strs= {"L","A","N","Q","I","A","O"};
public static void main(String[] args) {
f();
System.out.println(set.size());
}
private static void f() {
if(list.size()>=7) {
StringBuilder s=new StringBuilder("");
for(int i=0;i<=6;i++) {
s.append(strs[list.get(i)-1]);
}
set.add(s.toString());
return;
}
for(int i=1;i<=7;i++) {
if(!list.contains(i)) {
list.add(i);
//System.out.println(list);
f();
list.remove(list.size()-1);
}
}
}
}
4、凯撒密码加密
给定一个单词,请使用凯撒密码将这个单词加密。
凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文。
即a变为d,b变为e,…,w变为z,x变为a,y变为b,z变为c。
例如,lanqiao会变成odqtldr。
输入格式
输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式
输出一行,表示加密后的密文。
样例输入
lanqiao
样例输出
odqtldr
评测用例规模与约定
对于所有评测用例,单词中的字母个数不超过100。
public class Serct {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s1=sc.next();
char[] arr=s1.toCharArray();
for(int i=0;i<s1.length();i++) {
if(arr[i]>41||arr[i]<65) {
arr[i]=(char) (arr[i]+26+3+3);
}
arr[i]+=3;
}
for(int i=0;i<s1.length();i++) {
System.out.print(arr[i]);
}
}
}
5、反倍数
问题描述
给定三个整数 a, b, c,如果一个整数既不是 a 的整数倍也不是 b 的整数倍还不是 c 的整数倍,则这个数称为反倍数。
请问在 1 至 n 中有多少个反倍数。
输入格式
输入的第一行包含一个整数 n。
第二行包含三个整数 a, b, c,相邻两个数之间用一个空格分隔。
输出格式
输出一行包含一个整数,表示答案。
样例输入
30
2 3 6
样例输出
10
样例说明
以下这些数满足要求:1, 5, 7, 11, 13, 17, 19, 23, 25, 29。
抄自
https://blog.csdn.net/a1439775520/article/details/105495876