微信支付后台开发面经
一二面后面补上
三面
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
public class Main{ static class ListNode{ public ListNode(){} public ListNode(int val) { this.val=val; } int val; ListNode next; } public static void main(String[]args) { ListNode root01=new ListNode(2); ListNode l12=new ListNode(4); ListNode l13=new ListNode(3); root01.next=l12; l12.next=l13; ListNode root02=new ListNode(5); ListNode l22=new ListNode(6); ListNode l23=new ListNode(4); root02.next=l22; l22.next=l23; ListNode res=deal(root01,root02); while (res!=null) { System.out.print(res.val+"_"); res=res.next; } } static ListNode deal(ListNode l1,ListNode l2) { int tmp=0; int jin; ListNode res=new ListNode(); ListNode head=res; while (l1!=null || l2!=null) { if (l1!=null) { tmp+=l1.val; l1=l1.next; } if (l2!=null) { tmp+=l2.val; l2=l2.next; } head.next=new ListNode(); head=head.next; head.val=tmp%10; jin=tmp/10; tmp=jin; } if (tmp!=0) { head.next=new ListNode(); head.next.val=tmp; } return res.next; } }
无重复字符的最长子串 - 语言不限
题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
public class Main{ public static void main(String[]args) { String str="asddsffabcdefghijkabcd"; System.out.println(deal(str)); } static int deal(String str) { int left=0; int right=0; int maxLen=0; char ch; Set<Character>set=new HashSet<>(); while (left<=right && right<str.length()) { ch=str.charAt(right); if (!set.add(ch)) { int tmp=right-left; if (tmp>maxLen) { maxLen=tmp; } while ( left<=right && str.charAt(left)!=ch) { set.remove(str.charAt(left)); left++; } left++; right++; continue; } right++; } return Math.max(maxLen,(right-left)); } }
2、Java里面的常量实现方式,有没得const
3、Java里的static变量特性,生命周期等
4、有没有用MySQL?MySQL的索引实现方式,底层是哪些结构?考察哈希索引和B+树索引,各自的特点等。
5、聚簇索引和普通索引的差别
6、MySQL四种隔离级别,每种隔离级别会出现的情况
7、MySQL如何实现事务的
四面(面委会)
- 简介
- 做题:是个格式化输出,给一个字符串按下格式
public class Main { public static void main(String[]args) { String s="This utility is a filter which displays the specified files,&nbs***bsp;the standard input, if no files are specified, in a user spec"; deal(s,16); } static void deal(String str,int lineNum) { StringBuilder stringBuilder=new StringBuilder(); StringBuilder stringBuilder1=new StringBuilder(); //init int count=0; int lineCount=0; stringBuilder.append("00000000") .append(" "); int lineLen=0; for (char ch:str.toCharArray()) { count++; stringBuilder.append(getNum(ch)) .append(" "); stringBuilder1.append(ch); if (count==lineNum) { lineLen=stringBuilder.length(); System.out.print(stringBuilder.toString()); System.out.println(stringBuilder1.toString()); stringBuilder.delete(0,stringBuilder.length()+1); stringBuilder1.delete(0,stringBuilder1.length()+1); count=0; lineCount++; stringBuilder .append(format(getNum(lineCount*lineNum))) .append(" "); } } System.out.print(stringBuilder.toString()); int tmp=stringBuilder.length(); while (tmp++<lineLen) { System.out.print(" "); } System.out.println(stringBuilder1.toString()); stringBuilder.delete(0,stringBuilder.length()+1); stringBuilder1.delete(0,stringBuilder1.length()+1); } static String format(String num) { String res=num; while (res.length()!=8) { res='0'+res; } return res; } static String getNum(int ch) { int chInt=ch; int res=0; while (chInt/16!=0) { res=res*10+(chInt/16); chInt-=((chInt/16)*16); } return res +getChar(chInt); } static String getChar(int num) { if(num<10) { return String.valueOf(num); } char ch; switch (num) { case 10: ch='a'; break; case 11: ch='b'; break; case 12: ch='c'; break; case 13: ch='d'; break; case 14: ch='e'; break; default: ch='f'; } return String.valueOf(ch); } }
- 笔试完讲思路。遇到了什么问题
- 问问题:
- 知道Java里的 Timer 么?如果公司现在有个需求,需要自己实现一个 Timer,你会怎么设计?场景:海量任务。
- 任务怎么存储?怎么查询?系统如何高效的定时?
- 说说项目,遇到啥问题?有啥难点?特色?
五面(面委会)
- 简介
- 问项目是怎么样的,介绍下,上线没呢?(显然没有🤣)
- 看你简历都是Java,你咋个学的Java?看过哪些书
- 你来说说Java的 volatile 和synchronized的原理。哪些时候会用到 以上两个东西
- 知道JVM不?你知道 JVM内存分很多块不?
- 你知道Java编程经常面临内存回收,或者说内存膨胀的问题,你会怎么解决?从编程层面和 JVM层面说说。
- 看你写MySQL?你是只用过么?还是明白底层原理?(只晓得索引、存储等一些原理啥的,其它不是太清楚)
- 看你写了 Redis,你知道基本类型么?知道底层实现么?(说了下底层数据结构就,,,,,)
- 知道TCP么?知道TIME-WAIT阶段么?说说这个阶段的原理,为啥有这个阶段?这个阶段存在什么问题?(大致说了下,但是面试官说有点问题)
- 选个项目,详细说说,,,,,
- 做题:
①、 下面一段函数实现带有$和*两种通配符的字符串的匹配功能。其中:$表示长度大于0
的数字串,*表示任意长度的字符串。要求:按照自己对于算法的理解填写该函数的5个空白。可以应用strcmp,strcat,strlen等字符串操作函数,不要应用其它的C或者C++的库函数。请注意:必须是完全匹配才能返回true,比如21.txt和2a.txt可以匹配2*.txt, 2.tx或者2.txta 不能匹配*.txt。通配符可能出现多次。函数的参数与返回值的说明请参见函数的注释。
// 功能描述:表达式是否匹配成功,$表示长度大于0的数字串,*表示任意长的字符串
// 输入参数: @pRule 以’’结束的字符串,表示规则;
// @pStr, 以’’结束的待匹配的字符串;
bool IsRegularMatching(const char* pRule, const char* pStr)
{
const char* pTempRulePtr = pRule;
const char* pTempStrPtr = pStr;
unsigned int dwCount = 0;
unsigned int dwStrLen = (unsigned int)strlen(pStr);
while ((*pTempRulePtr != '') && (*pTempStrPtr != ''))
{
switch (__________)
{
case '*':
pTempRulePtr = pTempRulePtr + 1;
if (*pTempRulePtr == '')
return true;
else
{
dwStrLen = (unsigned int)strlen(pTempStrPtr);
for (dwCount = 0; dwCount < dwStrLen; dwCount++)
{
if (_______________)
return true;
}
}
break;
case '$':
if ( _____________ )
return false;
while ((*pTempStrPtr != '') && (*pTempStrPtr >= '0')
&& (*pTempStrPtr <= '9'))
pTempStrPtr++;
pTempRulePtr++;
break;
default:
if (*pTempRulePtr != *pTempStrPtr)
return _________________;
++pTempRulePtr;
++pTempStrPtr;
break;
}
}
if ((*pTempRulePtr != '') && (*pTempStrPtr == ''))
{
if (strcmp(pTempRulePtr, "*") == 0)
return true;
}
else
{
Return_______ ;
}
return false;
③、 在机场中,你想从A点前往B点。(为了将问题简化,假设机场是一条线性通道。)一些区域有电动扶梯(双向的),另一些区域没有。你的步行速度恒定为v,电动扶梯的运行速度为u,因此在扶梯上,你的实际速度为v+u。(显然,你不会搭乘与你前进方向不一致的扶梯。)你的目标是尽可能快地从A点到达B点。