资讯动态

算法面试题

发布时间:2026/9/10 21:17:02 来源:尧图企业网站定制
1.经典两数之和给定一个整数数组nums和一个目标值target找出数组中两个数使他们的和等于target输出他们的下标。importjava.util.HashMap;publicclassTest{publicstaticvoidmain(String[]args){TesttnewTest();t.twoSum2();}voidtwoSum1(){int[]arr{1,2,3,4,5,6,7,8,9};inttarget6;intindex10;intindex20;System.out.println(targettarget);for(inti0;iarr.length;i){for(intji1;jarr.length;j){if(arr[i]arr[j]target){index1i;index2j;System.out.printf(\n%d, %d,i,j);//System.out.println(index1index1,valuearr[index1], index2index2,valuearr[index2]);}}}}//1.用HasmMap存储值-下标//2.遍历数组对每个数//计算需要的补数//如果补数已经在map里面直接输出map.get(complement), i//把当前num和下标i存入mapvoidtwoSum2(){int[]arr{1,2,3,4,5,6,7,8,9};inttarget6;HashMapInteger,IntegermapnewHashMap();for(inti0;iarr.length;i){intnumtarget-arr[i];if(map.containsKey(num)){System.out.printf(\n%d, %d,i,map.get(num));//System.out.printf(\narr[%d]%d, arr[%d]%d,i,arr[i], map.get(num), num);}map.put(arr[i],i);}}}方法1双重循环时间复杂度O(n^2)方法2哈希表解法用空间换时间只需要一重循环遍历时间复杂度O(n)空间复杂度O(n)1.5经典三数之和1.6反转单向链表java版publicclassReverseList{staticclassLinkNode{publicintval;publicLinkNodenext;}LinkNodereverse(LinkNodehead){LinkNodeprenull,curhead;while(cur!null){LinkNodetempcur.next;cur.nextpre;precur;curtemp;}returnpre;}publicstaticvoidmain(String[]args){ReverseListrnewReverseList();LinkNodeheadnull,curnull;for(inti0;i5;i){LinkNodenodenewLinkNode();node.vali1;node.nextnull;if(headnull){headnode;}else{cur.nextnode;}curnode;}r.printList(head);headr.reverse(head);r.printList(head);}voidprintList(LinkNodehead){LinkNodecurhead;while(cur!null){System.out.printf(%d-,cur.val);curcur.next;}System.out.println();}}2.约瑟夫环有n个人围成一圈顺序排号。从第一个人开始报数从1到3报数凡报到3的人退出圈子问最后留下的是原来第几号的那位。publicclassYsf{voidysfh(){ArrayListIntegerlistnewArrayList();intn11;for(inti1;in;i){list.add(i);}intcount3;intindex0;while(list.size()1){index(indexcount-1)%list.size();list.remove(index);}System.out.println(list.get(0));}}核心公式index (index count - 1) % list.size();3.输出回文数对称数字1输入一个数字nn小于等于1000输出从1到n之间左右对称的数字一位数字直接输出两位数字就是两个数字一模一样的数如11,22,33…三位数如121,131,141,151…等publicclassO{//输出对称数字voiddcs(){intn10000;for(inti1;in;i){booleanbisDuiChen(i);if(b){System.out.print(i, );}}}//方法1booleanisDuiChen(intn){StringstrString.valueOf(n);intleft0;intrightstr.length()-1;while(leftright){if(str.charAt(left)!str.charAt(right)){returnfalse;}left;right--;}returntrue;}//方法2booleanisDuiChen2(intn){intoriginn;intreverse0;intlast0;while(n0){lastn%10;reversereverse*10last;nn/10;}returnoriginreverse;}}方法1直观好理解方法2相当于将数字翻转过来与原数进行比较相等则对称否则不对称。4.买鸡问题用小于等于n元去买100只鸡大鸡5元/只小鸡3元/只,还有1/3元每只的一种小鸡分别记为x只,y只,z只。编程求解x,y,z所有可能解。输入描述测试数据有多组输入n。x5y3z*1/310015x9yz300;输出描述对于每组输入,请输出x,y,z所有可行解按照xyz依次增大的顺序输出。示例1:输入 40输出x0,y0,z100x0,y1,z99x0,y2,z98x1,y0,z99publicclassO{voidmaiJi(){intn40;//int money40;for(intx0;xn/5;x){for(inty0;yn/3;y){intz100-x-y;if(z0){continue;}if(15*x9*yz3*n){System.out.printf(\nx:%d, y:%d, z:%d,x,y,z);}}}}}5.一年第几天输入年、月、日计算该天是本年的第几天。输入描述包括三个整数年(1Y3000)、月(1M12)、日(1D31)。输出描述输入可能有多组测试数据对于每一组测试数据输出一个整数代表Input中的年、月、日对应本年的第几天。示例1:输入1990 9 202000 5 1输出263122voiddiJiTian(){int[]months{31,28,31,30,31,30,31,31,30,31,30,31};ScannerscnewScanner(System.in);while(sc.hasNext()){intyearsc.nextInt();intmonthsc.nextInt();intdaysc.nextInt();intsum0;for(inti0;imonth-1;i){summonths[i];}sumday;if(month2){if(isRunNian(year)){sum1;}}System.out.println(sum);}sc.close();}booleanisRunNian(intyear){if((year%40year%100!0)||year%4000){returntrue;}else{returnfalse;}}7.输入字符串s和字符c要求去掉s中所有的c字符输入字符串s和字符c要求去掉s中所有的c字符并输出结果。输入描述测试数据有多组每组输入字符串s和字符c。输出描述对于每组输入,输出去除c字符后的结果。示例1:输入healloa输出helloimportjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);// 多组输入while(sc.hasNext()){Stringssc.next();// 输入字符串charcsc.next().charAt(0);// 输入字符// 核心把字符 c 替换成空字符串 删掉所有 cStringress.replace(c,);System.out.println(res);}sc.close();}}8.输出字符串排列一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例定义为GC-Ratio是序列中G和C两个字母的总的出现次数除以总的字母数目也就是序列长度。在基因工程中这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。给定一个很长的DNA序列以及要求的最小子序列长度研究人员经常会需要在其中找出GC-Ratio最高的子序列。输入描述输入一个string型基因序列和int型子串的长度输出描述找出GC比例最高的子串,如果有多个输出第一个的子串示例1:输入AACTGTGCACGACCTGA5输出GCACG完整 Java 代码直接运行importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);Stringdnasc.next();// DNA字符串intlensc.nextInt();// 子串长度char[]chdna.toCharArray();intmaxGc0;// 最大GC数量intstart0;// 最优子串起始下标// 1. 计算第一个窗口的GC数量for(inti0;ilen;i){if(ch[i]G||ch[i]C){maxGc;}}// 2. 滑动窗口intcurrentGcmaxGc;for(inti1;ich.length-len;i){// 去掉左边出去的字符if(ch[i-1]G||ch[i-1]C){currentGc--;}// 加上右边进来的新字符charnewCharch[ilen-1];if(newCharG||newCharC){currentGc;}// 3. 如果当前窗口GC更多更新最大值和起始位置if(currentGcmaxGc){maxGccurrentGc;starti;}}// 4. 截取结果输出Stringresultdna.substring(start,startlen);System.out.println(result);}}9.颠倒整数输入一个整数 a将这个整数颠倒再输出。例如输入为123000则输出为000321。输入描述一个整数 a。[0,2^31]输出描述这个整数颠倒之后的结果。示例1:输入123000输出000321题目分析重点输入数字123000原样颠倒每一位保留末尾的0→ 不能用数字反转会丢0本质当成字符串直接反转最简单Java 完整代码最简、符合题意importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);// 直接读取为字符串保留所有0Stringssc.next();StringBuildersbnewStringBuilder(s);// 反转sb.reverse();System.out.println(sb);}}运行示例输入123000反转字符串123000→000321输出00032110.字符串升序排序输出输入一个字符串长度小于等于200输出按字符顺序升序排序后的字符串。输入描述输入只有一行一个长度小于等于200的字符串。输出描述输出处理后的结果。示例1:输入bacd输出abcd我给你写最简单、最标准、考试直接满分的 Java 代码一行排序搞定#完整 Java 代码直接运行importjava.util.Arrays;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);// 1. 输入字符串Stringssc.next();// 2. 转成字符数组char[]chs.toCharArray();// 3. 系统排序升序abc...Arrays.sort(ch);// 4. 转回字符串输出System.out.println(newString(ch));}}11.输入一个字符串按字典序打印出该字符串中字符的所有排列。输入一个字符串按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述任意字符串输出描述排列出来的所有字符串abc,acb,bac,bca,cab,cba。示例1:输入abc输出abc,acb,bac,bca,cba,cab##完整 Java 代码满足字典序、格式一致import java.util.*; public class Main { // 去重 保证字典序 static SetString set new TreeSet(); public static void main(String[] args) { Scanner sc new Scanner(System.in); String str sc.next(); char[] arr str.toCharArray(); // 回溯全排列 permute(arr, 0); // 拼接成 逗号分隔 格式 String res String.join(,, set); System.out.println(res); } // 回溯start 为当前交换起始位置 public static void permute(char[] arr, int start) { if (start arr.length - 1) { set.add(new String(arr)); return; } for (int i start; i arr.length; i) { // 交换 swap(arr, start, i); // 递归下一位 permute(arr, start 1); // 回溯复原 swap(arr, start, i); } } public static void swap(char[] arr, int i, int j) { char temp arr[i]; arr[i] arr[j]; arr[j] temp; } }12.字符串通配符算法问题描述在计算机中通配符一种特殊语法广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。要求实现如下2个通配符*匹配0个或以上的字符字符由英文字母和数字0-9组成不区分大小写。下同匹配1个字符输入通配符表达式一组字符串。输出返回匹配的结果正确输出true错误输出false输入描述先输入一个带有通配符的字符串再输入一个需要匹配的字符串输出描述返回匹配的结果正确输出true错误输出false示例1:输入te?t*.*txt12.xls输出false#完整 Java 代码直接运行importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);Stringpatternsc.next();// 带通配符的模式Stringstrsc.next();// 要匹配的字符串booleanresultisMatch(pattern,str);System.out.println(result);}publicstaticbooleanisMatch(Stringp,Strings){intmp.length();intns.length();// dp[i][j]p前i个字符 匹配 s前j个字符boolean[][]dpnewboolean[m1][n1];// 初始空匹配空 truedp[0][0]true;// 处理开头连续 * 的情况* 匹配空for(inti1;im;i){if(p.charAt(i-1)*){dp[i][0]dp[i-1][0];}}// 开始填表for(inti1;im;i){for(intj1;jn;j){charcpp.charAt(i-1);charcss.charAt(j-1);if(cpcs||cp?){// 1. 字符相等 或 ?dp[i][j]dp[i-1][j-1];}elseif(cp*){// 2. * 两种情况// 匹配0个 或 匹配多个dp[i][j]dp[i-1][j]||dp[i][j-1];}// 都不是 false}}returndp[m][n];}}

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价