前言:java编写,代码尽可能带注释,部分题目附上解题思路。力求方便,所以不写如有错误,请指出,谢谢。

查找排序

  • 1、百钱买百鸡问题
  • 2、统计每个月兔子总数
  • 3、查找组成一个偶数最接近的两个素数
  • 4、公共字串计算
  • 5、成绩排序
  • 6、Redraiment的走法
  • 7、字符统计
  • 8、迷宫问题
  • 9、字符串排序
  • 10、质数因子
  • 11、自守数
  • 12、多线程

1、百钱买百鸡问题

题目描述
公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
详细描述:
接口说明
原型:
int GetResult(vector &list)
输入参数:无
输出参数(指针指向的内存区域保证有效):list  鸡翁、鸡母、鸡雏组合的列表
返回值:-1 失败     0 成功
import java.util.Scanner;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(sc.hasNext() ){int n = sc.nextInt(); // 将输入的1放入n,虽然没用// n1、n2、n3分别表示吉翁、继母、鸡雏int n1 = 0, n2 = 0, n3 = 0;//7x +4y = 100,两种思路:一、两层遍历;二、一层遍历for(n1 = 0; n1 <=14; n1++ ){for(n2 = 25; n2 >=0; n2--){int sum = 7 * n1 + 4 * n2;if(sum == 100){n3 = 100-n1-n2;System.out.println(n1 +" "+n2 + " "+n3);}}}for(n1 = 0; n1 <= 14; n1++){double j;if(n1 == 0){j = 25;}else{j = (100-7*n1)/4.0;}if(Math.abs(j- Math.round(j)) < 1e-6){n2 = (int)j;n3 = 100 - n1 - n2;System.out.println(n1 +" "+n2 + " "+n3);}}}}
}

2、统计每个月兔子总数

题目描述
有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?/*** 统计出兔子总数。* * @param monthCount 第几个月* @return 兔子总数*/public static int getTotalCount(int monthCount){return 0;}
import java.util.Scanner;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(sc.hasNext() ){int month = sc.nextInt();System.out.println(Main.getTotalCount(month));}}// 统计兔子总数public static int getTotalCount(int monthCount){if(monthCount < 0)return 0;// 初始化三个月份的兔子int oneMonthOld = 1;int twoMonthOld = 0;int threeMonthOld = 0;// 第一个月刚出生,所以月份要减一for(int i = 0; i < monthCount-1; i++){// 分别都长大一个月threeMonthOld += twoMonthOld;// 三月份的兔子要加上从二月份发育过来的twoMonthOld = oneMonthOld;oneMonthOld = threeMonthOld;}return oneMonthOld+twoMonthOld+threeMonthOld;}
}

3、查找组成一个偶数最接近的两个素数

注:这里动态规划,比较不好懂

题目描述
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对
import java.util.Scanner;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(sc.hasNext() ){int even = sc.nextInt();// 思路:从even/2向2查找质数,若另一个数也为质数满足条件int max = even/2;for(int i = max; i >=2; i--){if(Main.judge(i) && Main.judge(even-i)){System.out.println(i);System.out.println(even-i);break;}}}}// 判断是否为质数public static boolean judge(int number){if(number <= 1){return false;}for(int i = 2; i < number; i++){// 若区间除了1和number外存在能整除number的数,则说明不是质数if((number % i) == 0){return false;}}return true;}
}

4、公共字串计算

题目描述
题目标题:
计算两个字符串的最大公共字串的长度,字符不区分大小写
详细描述:
接口说明
原型:
int getCommonStrLength(char * pFirstStr, char * pSecondStr);
输入参数:char * pFirstStr //第一个字符串char * pSecondStr//第二个字符串
import java.util.Scanner;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(sc.hasNext() ){String str1 = sc.next();String str2 = sc.next();System.out.println(Main.getCommonStrLength(str1, str2));}}// 常规解法public static int getCommonStrLength(String str1, String str2){// 空值判断以及空指针异常if(str1 == null || str1.length() == 0 || str2 == null || str2.length()==0){return 0;}int len1 = str1.length();int len2 = str2.length();int  max = 0;// 初始化两个字符串的标志位,以及最大公共子串的长度for(int i = 0; i < len1;){for(int j = 0; j < len2;){// 找到第一个重复的字符,试图遍历公共子串if(str1.charAt(i) == str2.charAt(j)){// 当出现相等时候,要保证后面一串尽可能相等,但需要找出最长的公共子串// 出现相等则两个标志位一起走int p1 = i, p2 = j;int count = 0;//System.out.println(p1 + " " + p2);while(p1 < len1 && p2 < len2 && str1.charAt(p1) == str2.charAt(p2)){//System.out.println(""+str1.charAt(p1));p1++;p2++;count++;}// 走完公共子串后保存最大长度if(count > max){max = count;}}//str2中当前字符与str1中当前字符不相等的,str2当前字符标志后移一位j++;}// 遍历str2字符串都没找到与str1中当前字符相等,str1当前字符标志后移一位i++;}return max;}// 动态规划的解法public static int getCommonStrLength(String str1, String str2) {int len1 = str1.length();int len2 = str2.length();int[][] dp = new int[len1 + 1][len2 + 1];// 默认初始化为0for (int i = 1; i <= len1; i++) {for (int j = 1; j <= len2; j++) {if (str1.charAt(i - 1) == str2.charAt(j - 1)) {// 两层遍历,找出每一次字符相等位置,若找到公共子串,那么在二维数组中走向将一直斜向下dp[i][j] = dp[i - 1][j - 1] + 1;} }}int max = 0;for (int i = 0; i <= len1; i++) {for (int j = 0; j <= len2; j++) {if (max < dp[i][j])max = dp[i][j];}}return max;}
}

5、成绩排序

注意:感觉同样分数同样成绩这里LinkedHashMap怕不合适吧

题目描述
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
例示:
jack      70
peter     96
Tom       70
smith     67从高到低  成绩
peter     96
jack      70
Tom       70
smith     67从低到高
smith     67
jack      70
Tom       70
peter     96注:0代表从高到低,1代表从低到高

// 名字可能相同,分数可能相同,要想唯一键,则利用名字加分数
import java.util.*;
public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext() ){String name;Integer score;List<Integer> scoreList = new ArrayList<>();Map<String, Integer> map = new LinkedHashMap<>(); // 存放score与name+" "+score的映射int sortNum = sc.nextInt();int sortMethod = sc.nextInt(); // 0 表示升序,1表示降序for(int i = 0; i < sortNum; i++){name = sc.next();score = sc.nextInt();scoreList.add(score);map.put(name+" "+score, score);}Collections.sort(scoreList);if(sortMethod == 0){// 降序Collections.reverse(scoreList);}int pre = -1;for(int s : scoreList){if(pre == s){// scoreList中不用查找重复值continue;}for(String key : map.keySet()){if(map.get(key).equals(s)){// 第一次找到System.out.println(key);}}pre = s;}}}
}

6、Redraiment的走法

注意:最长递增序列

题目描述Redraiment是走梅花桩的高手。Redraiment总是起点不限,从前到后,往高的桩子走,但走的步数最多,不知道为什么?你能替Redraiment研究他最多走的步数吗?
样例输入
6
2 5 1 5 4 5
样例输出
3
提示Example:
6个点的高度各为 2 5 1 5 4 5
如从第1格开始走,最多为3步, 2 4 5
从第2格开始走,最多只有1步,5
而从第3格开始走最多有3步,1 4 5
从第5格开始走最多有2步,4 5所以这个结果是3。
import java.util.*;public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);while (input.hasNextInt()) {int n = input.nextInt();int[] a = new int[n];for (int i = 0; i < n; i++)a[i] = input.nextInt();System.out.println(getMaxSteps(a, n));}}// 转化成求最长递增子序列public static int getMaxSteps(int [] arr ,int n) {int[] dp = new int[n];for(int i = 0; i < n; i++){dp[i] = 1;for(int j = 0; j < i; j++){if(arr[j] < arr[i]){dp[i] = Math.max(dp[i], dp[j]+1);}}}// 遍历数组找出最大值int max = 0;for(int i = 0; i < n; i++){if(dp[i] > max){max = dp[i];}}return max;}
}

7、字符统计

题目描述
如果统计的个数相同,则按照ASCII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
实现以下接口:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
清空目前的统计结果,重新统计
调用者会保证:
输入的字符串以‘\0’结尾。
package zTestDay;import java.util.*;public class Main {// 方法一,hashMap加treeMappublic static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {Map<Character, Integer> map = new HashMap<>();String str = sc.next();for(int i = 0; i < str.length(); i++){Character key = str.charAt(i);// 只对英文字符,数字,空格统计if((key >= '0' && key <= '9') || (key >= 'A' && key <='Z') || (key >= 'a' && key <='z')  || key == ' '){if(map.containsKey(key) ){map.put(key, map.get(key)+1);}else{map.put(key, 1);}}}Map<Integer, Character> treeMap = new TreeMap<>();for(Character key :map.keySet()){// 有相同次数key,无相同的val, 所以利用map的key与val构造treeMap新的唯一keytreeMap.put(map.get(key) * 128 + 128 - key , key); // 这里必须是-key,才能使得出现相同的次数的字母按照assic降序排列}StringBuilder sb = new StringBuilder();for(Integer i : treeMap.keySet()){sb.append(treeMap.get(i));}System.out.println(sb.reverse().toString());}}// 方法二、treeMap与次数降序查找,能够运用主要是因为字符最多256public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {Map<Character, Integer> map = new TreeMap<>(); // 必须用treeMapSet<Integer> set = new HashSet<>();String str = sc.next();for(int i = 0; i < str.length(); i++){Character key = str.charAt(i);// 只对英文字符,数字,空格统计if((key >= '0' && key <= '9') || (key >= 'A' && key <='Z') || (key >= 'a' && key <='z')  || key == ' '){if(map.containsKey(key) ){map.put(key, map.get(key)+1);}else{map.put(key, 1);}set.add(map.get(key)); // 保存出现的次数,去重}}List<Integer> count = new ArrayList<>();for(Integer i :set){count.add(i);}Collections.reverse(count); // 将出现次数降序StringBuilder sb = new StringBuilder();for(Integer i : count){for(Character key : map.keySet()){// 这里hashmap里面存储字符,所以数据不会太多,要不然不能两层循环if(map.get(key) == i){sb.append(key);}}}System.out.println(sb.toString());}}
}

8、迷宫问题

题目描述
定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:
int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,
};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。
Input
一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
Output
左上角到右下角的最短路径,格式如样例所示。Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
import java.util.LinkedList;
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){int rows = sc.nextInt();int cols = sc.nextInt();int[][] maze = new int[rows][cols]; // 0表示未访问,1表示以访问,-1表示无法访问for(int i = 0; i < rows; i++){for(int j = 0; j < cols; j++){int val = sc.nextInt();if(val == 1){maze[i][j]=-1;}}}//System.out.println(rows+" "+ cols);LinkedList<String> list = new LinkedList<>();findRoute(maze, 0, 0, rows, cols, list);for(String step : list){System.out.println(step);}}}private static boolean findRoute(int[][] maze, int i, int j, int rows, int cols, LinkedList<String> list) {if(i >= 0 && j >= 0 && i < rows && j < cols && maze[i][j] == 0){// 能访问(i,j)这位置maze[i][j] = 1;list.add("("+i+","+j+")");if(i == rows-1 && j == cols-1){// 已经找到了出口点return true;}if(findRoute(maze, i+1, j, rows, cols, list)|| findRoute(maze, i-1, j, rows, cols, list)|| findRoute(maze, i, j+1, rows, cols, list)|| findRoute(maze, i, j-1, rows, cols, list)){// 能继续访问下一步return true;}else{// 恢复未访问的状态maze[i][j] = 0;list.removeLast();return false;}}else{// 不能访问此位置return false;}}
}

9、字符串排序

注:思路不够简洁

题目描述
编写一个程序,将输入字符串中的字符按如下规则排序。规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
import java.util.*;// 利用treeMap的键排序,利用hashMap保存位置映射关系
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String input = sc.nextLine();TreeMap<Character, String> map = new TreeMap<>(); // 利用treemap的key排序,//ArrayList<Character> list = new ArrayList<>();HashMap<Integer, Character> hashMap = new HashMap<>(); // 非英文字母位置映射for (int i = 0; i < input.length(); i++) {char c = input.charAt(i); // 字符if (Character.isLetter(c)) {// 字符为字母char lower = Character.toLowerCase(c);if (map.containsKey(lower)) {map.put(lower, map.get(lower) + c); // 将小写字母作为key,小写后相同的字母按顺序排列为value} else {map.put(lower, c + "");}//list.add(c); // 列表添加字符} else {// 若字符不为字母,保存位置映射关系hashMap.put(i, c);}}// 这里同时可以利用集合排序,那么也不需要利用hashMap保存非字母位置,遍历输入字符串,非字母字符位置就知道了
/*            Collections.sort(list, new Comparator<Character>() {@Overridepublic int compare(Character o1, Character o2) {return Character.toLowerCase(o1) - Character.toLowerCase(o2);}});*/StringBuilder sb = new StringBuilder(); // 存储字符为字母的数组,并按照小写字母排序for (Character key : map.keySet()) {sb.append(map.get(key));}StringBuilder sb2 = new StringBuilder();int i = 0, j = 0;while (i < input.length()) {if (hashMap.containsKey(i)) {sb2.append(hashMap.get(i));} else if (j < sb.length()) {sb2.append(sb.charAt(j++));}i++;}System.out.println(sb2.toString());}}
}

10、质数因子

题目描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
最后一个数后面也要有空格
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {Long input = sc.nextLong();ArrayList<Integer> list = new ArrayList<>();int n = 2;while(input >= 2){if(input % n == 0){// 若能整除,添加质数因子input = input / n;list.add(n);}else{// 找下一个质数//n = getNext(n);n++; // 这里压根不需要找下一个质数,而是加一就行,和质数定义有关}}for(Integer i : list){System.out.print(i + " ");}}}// 找出下一位质数private static int getNext(int n) {while(true){n++;if(judge(n)){return n;}}}// 判断是否为质数private static boolean judge(int n) {for(int i = 2; i < n; i++){if(n % i == 0){return false;}}return true;}
}

11、自守数

题目描述
自守数是指一个数的平方的尾数等于该数自身的自然数。
例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n以内的自守数的个数
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {Long input = sc.nextLong();int cnt = 1;for(int i = 1; i <= input; i++){// 0 也算自守数if(judge(i)){cnt++;}}System.out.println(cnt);}}// 判断是否自守数private static boolean judge(long i) {int count = 1; // 统计是几位数if(i <= 0)return false;while(i >= (long)Math.pow(10, count)){count++;}long square = i * i;long divisor = (long)Math.pow(10, count); //若尾数部分全部相同,相减后整除10次方位数,如25就是两位数,除以100if((square - i) % divisor == 0){return true;}return false;}
}

12、多线程

注意:牛客上看到的通过案列Java不对,只能本地通过,牛客不通过

题目描述
问题描述:有4个线程和1个公共的字符数组。线程1的功能就是向数组输出A,线程2的功能就是向字符输出B,线程3的功能就是向数组输出C,线程4的功能就是向数组输出D。要求按顺序向数组赋值ABCDABCDABCD
import java.util.Scanner;public class Main {public static void main(String[] args) throws Exception{Object a = new Object();Object b = new Object();Object c = new Object();Object d = new Object();Scanner sc  = new Scanner(System.in);while (sc.hasNext()){int count = sc.nextInt();Runnable pa = new MyRunnable("A", d, a, count);Runnable pb = new MyRunnable("B", a, b, count);Runnable pc = new MyRunnable("C", b, c, count);Runnable pd = new MyRunnable("D", c, d, count);new Thread(pa).start();Thread.sleep(1);new Thread(pb).start();Thread.sleep(1);new Thread(pc).start();Thread.sleep(1);new Thread(pd).start();}}
}class MyRunnable implements Runnable{private String name;private Object prev;private Object self;private int count;MyRunnable(String name, Object prev, Object self, int count) {this.name = name;this.prev = prev;this.self = self;this.count = count;}@Overridepublic void run() {// int count = 10;while (count > 0) {synchronized (prev){synchronized (self){System.out.print(name);count--;self.notify();}try {prev.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}
}

牛客华为机试-查找排序相关推荐

  1. 牛客华为机试第3题python

    题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对 ...

  2. 牛客华为机试第8题python

    题目描述 数据表记录包含表索引和数值(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述: 先输入键值对的个数 然后输入成对的 ...

  3. 牛客华为机试第7题python

    题目描述 写出一个程序,接受一个正浮点数值,输出该数值的近似整数值.如果小数点后数值大于等于5,向上取整:小于5,则向下取整. 输入描述: 输入一个正浮点数值 输出描述: 输出该数值的近似整数值 示例 ...

  4. 牛客华为机试第6题python

    题目描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 ) 最后一个数后面也要有空格 输入描述: 输入一个long型整数 输出描述 ...

  5. 牛客华为机试第5题python

    题目描述 写出一个程序,接受一个十六进制的数,输出该数值的十进制表示. 输入描述: 输入一个十六进制的数值字符串.注意:一个用例会同时有多组输入数据,请参考帖子https://www.nowcoder ...

  6. 牛客华为机试第4题python

    题目描述 •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入多次,每个字符串长度小于1 ...

  7. 牛客华为机试第2题python

    题目描述 写出一个程序,接受一个由字母.数字和空格组成的字符串,和一个字母,然后输出输入字符串中该字母的出现次数.不区分大小写. 输入描述: 第一行输入一个由字母和数字以及空格组成的字符串,第二行输入 ...

  8. 牛客华为机试第1题python

    题目描述 计算字符串最后一个单词的长度,单词以空格隔开. 输入描述: 输入一行,代表要计算的字符串,非空,长度小于5000. 输出描述: 输出一个整数,表示输入字符串最后一个单词的长度. 示例1 输入 ...

  9. 牛客 华为机试(我的代码记录)

    https://www.nowcoder.com/ta/huawei 编译器信息 版本:clang++3.9,采用c++11标准,编译的时候采用-O2级优化,支持万能头文件 <bits/stdc ...

最新文章

  1. android aliasactivity作用,android activity-alias 的作用
  2. wallpaper怎么改后缀_腾讯微信视频号怎么引流?腾讯视频号引流有哪些方法?
  3. 在DataList控件中删除数据记录
  4. 编译libav(ffmpeg)库
  5. PyTorch框架学习十四——学习率调整策略
  6. java共享租车信息管理系统jsp源码
  7. 7-7 天梯赛的善良 (20 分)
  8. Python风格总结:数据结构
  9. 在线开关MySQL5.7 GTID_MySQL5.7 GTID在线开启与关闭【转】
  10. ds18b20温度转换指令_学习心得 | 温度检测工程模块划分总结与案例分析
  11. 数控g71编程实例带图_数控编程代码g71 数控g71编程实例有图
  12. crmeb java单商户源码java二开文档部署文档H5商城部署文档【5】
  13. Sql基本语句增删改查
  14. c语言中求tana反函数,反正切函数arctanx的导数是什么
  15. vscode 是干什么用的_vscode里的launch.json是干什么用的
  16. 汉诺塔解法C语言实现
  17. JSAPI微信支付java
  18. 用Java编写程序实现找出100以内的质数
  19. 阅读“变形计”:一场偶然与非偶然的相遇
  20. 【Linux】一万七千字详解 —— 基本指令(二)

热门文章

  1. PaddleNLP基于ERNIR3.0文本分类以中医疗搜索检索词意图分类(KUAKE-QIC)为例【多分类(单标签)】
  2. obs多推流地址_手把手教你-OBS录屏使用
  3. (43.1)【web应用漏洞发现】漏洞平台、开发框架、CMS漏扫工具
  4. sd敢达g世纪android,SD敢达G世纪 世界/超越世界 安卓模拟器金手指代码亲测有用...
  5. C语言编程b a化简,C语言编程,已知三角形的三边长a,b,c,计算求三角... 如果三角形三边长 a,b,c,满足( )那么这个三角形......
  6. PMSG永磁同步发电机并网仿真模型
  7. 网络连接正常但百度网页打不开显示无法访问此网站解决方案
  8. Stream流的学习
  9. 林亦杉厦门大学计算机学院,挥别厦大,点燃未来-厦门大学计算机科学系
  10. SpingBoot/JAVA实现给图片加水印功能(通过thumbnailator库)