抽象建模能力

题一:【扑克牌顺子】

LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。

分析:想通过快排进行数组排序,找出大小王个数(0的个数),然后找出非大小王顺子中缺少的个数。比较大小王个数和顺子缺少个数。

 public class Solution {
public boolean isContinuous(int [] numbers) {
if(numbers.length==0) return false;
//快排
quickSort(numbers,0,numbers.length-1);
//找出大小王个数
int kingNum = 0;
for(int i=0;i<numbers.length;i++){
if(numbers[i]==0){
kingNum++;
}
}
//缺少的数字个数
int lackNum = 0;
for(int i=kingNum;i<numbers.length-1;i++){
if(numbers[i]==numbers[i+1]){
return false;
}
lackNum += numbers[i+1]-numbers[i]-1;
}
if(kingNum==lackNum||kingNum==numbers.length-1){
return true;
}else{
return false;
}
}
public void quickSort(int[] numbers, int left, int right){
if(left<right){
int index = divisionSort(numbers,left,right);
quickSort(numbers,left,index-1);
quickSort(numbers,index+1,right);
}
}
public int divisionSort(int[] numbers, int left, int right){
int base = numbers[left];
while(left<right){
while(left<right&&numbers[right]>=base){
right--;
}
numbers[left] = numbers[right];
while(left<right&&numbers[left]<=base){
left++;
}
numbers[right] = numbers[left];
}
numbers[left] = base;
return left;
}
}

分析:上述分析想复杂了,顺子只有5张牌,因此保证最大值和最小值(非0)在5以内并且没有重复元素即可。代码略。

题二:【孩子们的游戏(圆圈中最后剩下的数)】

每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)。如果没有小朋友,请返回-1。
 
分析:Josephu问题,n个数循环,每次去除掉第m个数,输出最后一个被去除的数。根据循环的n个数建立一个循环链表,每次数到m数,就删除该节点。
 class ListNode{
int val;
ListNode next = null;
ListNode(int val){
this.val = val;
}
}
public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n<=0||m<=0) return -1;
//构建循环链表
ListNode head = new ListNode(0);
ListNode node = head;
for(int i=1;i<n;i++){
node.next = new ListNode(i);
node = node.next;
}
node.next = head;
//删除节点
int k=0;
while(node.next!=node){
if(++k==m){
node.next = node.next.next;
k=0;
}else{
node = node.next;
}
}
return node.val;
}
}
 分析:规律总结,f(n,m)表示每次在n个数字0,1,…,n-1中删除第m个数字最后剩下的数字。

 public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n<=0||m<=0) return -1;
if(n==1) return 0;
return (LastRemaining_Solution(n-1,m)+m)%n;
}
}

发散思维能力

题三:【求1+2+3+…n】

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

分析:公式法

 public class Solution {
public int Sum_Solution(int n) {
return (1+n)*n/2;
}
}

分析:不给用循环,那就使用递归,if也不能用。使用逻辑与的短路特性。

 public class Solution {
public int Sum_Solution(int n) {
boolean res = (n>0)&&((n+=Sum_Solution(n-1))>0);
return n;
}
}

题四:【不用加减乘除做加法】

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

分析:两个数异或:相当于每一位相加,不考虑进位;两个数相与,并左移一位:相当于求的进位。将上述两个结果相加就得到和。但是本题不允许使用+符号,因此不断进行循环,使得相与的结果为0,则异或的结果即为最终答案。(在每一轮循环中,两种操作结果的和都相等,只是因为不允许使用加号才不断循环)。

 public class Solution {
public int Add(int num1,int num2) {
while(num2!=0){
int res = num1^num2;//两数异或
int carray = (num1&num2)<<1;//俩数相与,左移一位
num1 = res;
num2 = carray;
}
return num1;
}
}

综合

题五:【把字符串转换成整数】

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入一个字符串,包括数字字母符号,可以为空。如果是合法的数值表达则返回该数字,否则返回0。输入:+321456;输出:321456;/输入:    la33;输出:0;

分析:字符串转换成数字,可以理解为字符转换成数字,即减去‘0’字符的ASCII值。还需要考虑内存溢出问题,非法字符串问题。

 public class Solution {
public int StrToInt(String str) {
if(str==null||str.length()==0) return 0;
str = str.trim();
if(str.length()==0) return 0;
boolean flag = false;//正负标志,false表示正数,true表示负数
long res = 0;//因为可能会出现int溢出,所以先设置为long类型
char first = str.charAt(0);
if(first=='+'){
flag = false;
}else if(first=='-'){
flag = true;
}else{
res = first-'0';
}
for(int i=1;i<str.length();i++){
char ch = str.charAt(i);
if(ch<='9'&&ch>='0'){
res *= 10;
res += ch-'0';
}else{
return 0;
}
}
//判断正负
if(flag){
res = -res;
}
//处理内存溢出
if(res>Integer.MAX_VALUE||res<Integer.MIN_VALUE){
return 0;
}
return (int)res;
}
}

17. 抽象建模能力&发散思维能力&综合(5)的更多相关文章

  1. 面试题之发散思维能力:如何用非常规方法求1+2+···+n

    今天在<剑指offer>里看到了下面这样一个简单且有趣的题,考察程序员的发散思维能力,前提是你对C++相关知识点熟悉,否则是想不出来方案的,分享给大家.   题目:求1+2+···+n,要 ...

  2. 64 求1+2+3+...+n(发散思维能力 )

    题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 解题思路: 1)利用&&的短 ...

  3. 大公司的PHP面试题

    1. 禁用COOKIE 后 SEESION 还能用吗? 2. 抓取远程图片到本地,你会用什么函数? 4. 你觉得在pV10W的时候, 同等配置下,LUNIX 比WIN快多少? 5. 简述pOST 和G ...

  4. 面试经典算法题集锦——《剑指 offer》小结

    从今年 3 月份开始准备找实习,到现在校招结束,申请的工作均为机器学习/数据挖掘算法相关职位,也拿到了几个 sp offer.经历这半年的洗礼,自己的综合能力和素质都得到了一个质的提升. 实话说对于未 ...

  5. 《剑指offer》面试题的Python实现

    <剑指Offer>是很多程序员面试前要看的书,但里面的算法都是基于C++实现的,最近用了三周左右时间,用Python完成了里面几乎所有的算法题,由于时间以及个人水平均有限,或许会有部分问题 ...

  6. 剑指Offer题解索引

    数组 数组中重复的数字 二维数组中的查找 构建乘积数组 字符串 替换空格 字符流中第一个不重复的字符 表示数值的字符串 递归和循环 斐波那契数列 跳台阶 变态跳台阶 矩形覆盖 链表 从尾到头打印链表 ...

  7. 剑指offer题目记录

    1.如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString { public: CMyString(char* pData = NULL); CMyStri ...

  8. 剑指Offer-第一章面试细节总结

    面试细节:行为面试(20%)+技术面试(70%)+应聘者提问(10%) * 行为面试:跳槽者(不要抱怨老板,不要抱怨同事,只为追寻自己的理想而站斗) * 技术面试:1.基础知识点(编程语言,数据结构( ...

  9. Java面试大纲-java面试该做哪些准备,java开发达到这样的水平可以涨工资

    Java培训结束,面临的就是毕业找工作.在找工作时,就要针对性地做充分的面试准备.准备不充分的面试,完全是浪费时间,更是对自己的不负责. 上海尚学堂Java培训整理出Java面试大纲,其中大部分都是面 ...

随机推荐

  1. AcWing 836. 合并集合

    地址  https://www.acwing.com/problem/content/838/ 一共有n个数,编号是1~n,最开始每个数各自在一个集合中. 现在要进行m个操作,操作共有两种: “M a ...

  2. Spring Batch与ETL工具比较

    在实际应用中,在批处理中用得较多的是场景是数据同步.在做数据集成工作中,常常需要从源位置把数据同步到目标位置,以便于进行后续的逻辑操作.在做这种批处理工具时,在网上查资料,发现用得比较多的是kettl ...

  3. DirectShow 进行视频预览和录制

    这一篇讲怎么采集摄像头图像并预览,以及录制视频到本地. 程序实现流程 这里通过使用 CaptureGraphBuilder 来简化 Graph 的创建流程. 具体流程如下: 初始化 COM 库 创建各 ...

  4. 使用Xmanager分析Java内存情况

    今天是想看下程序在正式环境中,内存使用回收的情况,于是开始. 1.首先下载Xmanager,Xshell,然后在Xshell-设置-隧道中设置转发X11连接到Xmanager: 2.开始布置Linux ...

  5. IT兄弟连 Java语法教程 流程控制语句 分支结构语句2

    2  if-else条件语句 if-else语句的完整形式如下: if(判断条件){ A代码块(判断条件的值为true,执行) }else{ B代码块(判断条件的值为false,执行) } 当然,如果 ...

  6. java自定义equals函数和hashCode函数

    所有类都继承自Object类,他所有的非final方法:equals,hashCode, toString, clone 和 finalize,它们都有通用约定. 我们在覆盖这些方法的时候需要遵循这些 ...

  7. 公益:开放一台Nacos服务端给各位Spring Cloud爱好者

    之前开放过一台公益Eureka Server给大家,以方便大家在阅读我博客中教程时候做实验.由于目前在连载Spring Cloud Alibaba,所以对应的也部署了一台Nacos,并且也开放出来,给 ...

  8. 【LeetCode】2. 两数相加

    题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.   如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  9. C# - VS2019通过重写pictureBox实现简单的桌面截图功能

    前言 通过创建客制化组件(继承pictureBox),新增属性和构造方法,实现屏幕截图时需要用到的功能点.再通过监控鼠标按下.移动和释放,来获取起始点区域.最后通过操作BMP图像,实现截图的新增.修改 ...

  10. uni-app自定义Modal弹窗组件|仿ios、微信弹窗效果

    介绍 uniapp自定义弹窗组件uniPop,基于uni-app开发的自定义模态弹窗|msg信息框|alert对话框|confirm确认框|toast弱提示框 支持多种动画效果.多弹窗类型ios/an ...