1.执行如下程序,输出结果是()
class Test
{
private int data;
int result = 0;
public void m()
{
result += 2;
data += 2;
System.out.print(result + " " + data);
}
}
class ThreadExample extends Thread
{
private Test mv;
public ThreadExample(Test mv)
{
this.mv = mv;
}
public void run()
{
synchronized(mv)
{
mv.m();
}
}
}
class ThreadTest
{
public static void main(String args[])
{
Test mv = new Test();
Thread t1 = new ThreadExample(mv);
Thread t2 = new ThreadExample(mv);
Thread t3 = new ThreadExample(mv);
t1.start();
t2.start();
t3.start();
}
}
//2 24 46 6
2.统计回文
https://www.nowcoder.com/questionTerminal/9d1559511b3849deaa71b576fa7009dc
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A = “aba”,B = “b”。这里有4种把B插入A的办法:
- 在A的第一个字母之前: “baba” 不是回文
- 在第一个字母‘a’之后: “abba” 是回文
- 在字母‘b’之后: “abba” 是回文
- 在第二个字母’a’之后 “abab” 不是回文
所以满足条件的答案为2
public class Test3 {
public static boolean huiWen(String s1) {
int i = 0;
int j = s1.length() - 1;
int len = s1.length() / 2;
while (i < len && j >= len) {
if (s1.charAt(i) == s1.charAt(j)) {
i++;
j--;
} else {
return false;
}
}
return true;
}
public static int Solution(String s1,String s2) {
int len = s1.length();
int i = 0;
int count = 0;
if (huiWen(s2.concat(s1))) {
count++;
}
while (i < len) {
String ms1 = s1.substring(0, i + 1);
String ms2 = s1.substring(i + 1);
String result = ms1.concat(s2).concat(ms2);
if (huiWen(result)) {
count++;
}
i++;
}
return count;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String message1 = sc.nextLine();
String message2 = sc.nextLine();
int result = Solution(message1,message2);
System.out.println(result);
}
}
3.寻找第K大
https://www.nowcoder.com/questionTerminal/e016ad9b7f0b45048c58a9f27ba618bf
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
测试样例:
[1,3,5,2,2],5,3
返回:2
public class Finder {
public int findKth(int[] a, int n, int K) {
return findKth(a, 0, n-1, K);
}
public int findKth(int[] a, int low, int high, int k) {
int part = partation(a, low, high);
if(k == part - low + 1) return a[part];
else if(k > part - low + 1) return findKth(a, part + 1, high, k - part + low -1);
else return findKth(a, low, part -1, k);
}
public int partation(int[] a, int low, int high) {
int key = a[low];
while(low < high) {
while(low < high && a[high] <= key) high--;
a[low] = a[high];
while(low < high && a[low] >= key) low++;
a[high] = a[low];
}
a[low] = key;
return low;
}
}