微信支付后台开发面经
一二面后面补上
三面
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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点。

