抽象建模能力

题一:【扑克牌顺子】

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. LG4158 「SCOI2009」粉刷匠 线性DP

    问题描述 LG4158 题解 设\(opt[i][j][k]\)代表到\((i,k)\)刷了\(j\)次的方案数. 一开始DP顺序有点问题,调了很长时间. 务必考虑清楚DP顺序问题 \(\mathrm ...

  2. SQL Server 约束的增删改

    1. 非空约束 列的为空性决定表中的行是否可以包含空值.空置(NULL)不同于零(0)/空白或者长度为零的字符串(“”). (1)创建非空约束 create table orders ( docent ...

  3. SLB外部端口非80时---》转发到nginx---》URL跳转丢失端口的解决方案

    配置nginx反向代理时遇到一个问题,当设置nginx监听80端口时转发请求没有问题.但一旦设置为监听其他端口,就一直跳转不正常: 如,访问欢迎页面时应该是重定向到登录页面,在这个重定向的过程中端口丢 ...

  4. javascript的10个开发技巧

    总结10个提高开发效率的JavaScript开发技巧. 1.生成随机的uid. const genUid = () => { var length = 20; var soupLength = ...

  5. Redis for OPS 04:主从复制

    写在前面的话 Redis 的主从其实和 MySQL 类似,更多的还是作为备份的功能存在,在复杂的 Rediis 集群架构中,主从也是不可或缺的. 主从复制 主从复制原理: 1. 从库通过命令连接到主库 ...

  6. SpringBoot开发案例之mail中文附件名字乱码

    最近在开发一个邮件发送多附件的微服务,使用的是org.springframework.mail.javamail.JavaMailSender;包下面的JavaMailSender 但是发送出来的附件 ...

  7. 聊聊 Vue 中 title 的动态修改

    由于之前的 Vue 项目打包成果物一直是嵌入集成平台中,所以一直没有关注过项目的 title.直到最近,突然有个需求,要求点击按钮在集成平台外新开一个页面,此时我才发现,原来我的项目的 title 一 ...

  8. java基础(28):数据库、表及表数据、SQL语句

    1. 数据库 1.1 数据库概述 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. 什么是数据库 ...

  9. 转:用 Python 一键分析你的上网行为, 看是在认真工作还是摸鱼

    简介 想看看你最近一年都在干嘛?看看你平时上网是在摸鱼还是认真工作?想写年度汇报总结,但是苦于没有数据?现在,它来了. 这是一个能让你了解自己的浏览历史的Chrome浏览历史记录分析程序,当然了,他仅 ...

  10. python3 对list对象的增删改查

    class peoples: people_list =[] class people: name='' age=-1 def __init__(self,name,age): self.name = ...