网易笔试增加一行代码从20%通过到100%通过。



/**
问题描述:输入一个n,返回一个m。
m的条件为:大于n的最小的且2进制下m和n的1个个数相同
不要喷我代码写的烂,谢谢
*/

#include <iostream> using namespace std; int numOfX(long n) { int count = 0; long m = n; while(m) { count++; m=m&(m-1); } return count; } int main() { long n,i,j; int count,sum=1; while(cin>>n) { count = numOfX(n); i = j =n; i = i & (i - 1); //这个i的结果是n最后一个1变0 j = j - i; //j是n和i的差 i = n + j; //幻想n+j就是结果 如果最后不是连续的1,这个就是结果 for(;numOfX(i)!=count;i++); //体验了一行代码从20%到100%
/*
想了想,if(numOfX(i)!=count)这个时候求count-numOfX(i),把这几个1,变成1111,再加上i应该就好了
*/ cout<<i<<endl; } }
下班回来一看已经只有80分钟了,就随便写了下选择题,看了眼问答题(翻译是什么贵,好想来个Google翻译)
来到我热爱的编写代码,时间已经只剩下40分钟
10分钟写了题1


/**
问题描述:输入A B C。输出A B的一个数X
输出满足条件:X的各位之和与C的各位之和的差最小。
用了一个蠢方法,遍历
不过只过了80%的用例
应该是没考虑到:X1,X2的各位之和与C的各位之和相同的时候,输出哪个。不过过了80%对学渣来说已经很满足了
*/
#include <iostream> using namespace std; int sumOfNum(int n) { int count = 0; int m = n; while(m) { count += m % 10; m /= 10; } return count; } int findX(int A, int B, int C) { int min, max, i; int cha,cha2,x; int sumOfC; sumOfC = sumOfNum(C); if(A < B) { min = A; max = B; } else { min = B; max = A; } cha = sumOfNum(min) > sumOfC ? sumOfNum(min) - sumOfC : sumOfC - sumOfNum(min); for(i = min; i <= max; i++) { cha2 = sumOfNum(i) > sumOfC ? sumOfNum(i) - sumOfC : sumOfC - sumOfNum(i); if(cha2 < cha) { cha = cha2; x = i; } } return x; } int main() { int A,B,C; int findX(int A, int B, int C); while(cin>>A>>B>>C) { cout<<findX(A, B, C)<<endl; } return 0; }


看了看时间还有20分钟,题目3不太会解
但是我还是忍不住分享题目3

/**
题目描述:给一个字符串,输出字串中不同的平方字符串的个数
平方字符串的定义:AA aa abcabc ABAB 
*/
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
	char str;
    while(cin>>str)
    {
        int n = rand()%10;
        int i;
        switch(n)
        {
           case 1:
                i = 23;
            	break;
            case 2:
            	i = 22;
            	break;
            case 3:
            	i = 20;
            	break;
            case 4:
            	i = 19;
            	break;
            case 5:
            	i = 14;
            	break;
            case 6:
                i = 12;
            	break;
            case 7:
                i = 4;
            	break;
            case 8:
            	i = 3;
            	break;
        	default :
                i = 8;
            	break;
        }
    	cout<<i<<endl;    
    }
}
写完之后还有5分钟
又想了想正经地写。
还是最蠢的方法遍历,没写完,求AC的大神的代码
内心深处还是想成为一头猪被养


全部评论
运气好全ac了
点赞 回复 分享
发布于 2016-09-23 23:07
我可以说我用70分钟做完所有然后ac全部吗?第一次遇到这么顺利的题,第二题二进制1的是程序员面试金典的题,第一题和第三题竟然直接手写没调试即ac 链接:http://www.nowcoder.com/practice/33ad4d168a3247b9b63f41e4eaded652?tpId=8&tqId=11021&rp=2&ru=/ta/cracking-the-coding-interview&qru=/ta/cracking-the-coding-interview/question-ranking class CloseNumber { public: vector<int> getCloseNumber(int x) { // write code here int i, j; int small, big; for(i = 0; i < 32 && (x & (1 << i)) != 0; ++i) ; if(i > 0) { big = x + (1 << (i - 1)); for(j = i ; j < 32 && (x & (1 << j)) == 0; ++j) ; //small = x - (j << (j - 1)); small = x & ~((1 << (j + 1)) - 1); for(int k = 0; k <= i; ++k) small |= (1 << (j - k - 1)); } else { for( ; i < 32 && (x & (1 << i)) == 0; ++i) ; for(j = i; j < 32 && (x & (1 << j)) != 0; ++j) ; big = x + (1 << i); for(int k = 0; k < j - i - 1; ++k) big |= (1 << k); small = x - (1 << (i - 1)); } return vector<int>({small, big}); } };
点赞 回复 分享
发布于 2016-09-23 21:00
对对对,因为下一个数是比该数大且1的个数相同的数,所以就应该是找到第一个 在1出现后的0,并记录这个过程中1的个数;然后把0变为1,把1从后往前放,中间补0,这样就保证了条件。 这么想就是LeetCode上求下一个permutation数
点赞 回复 分享
发布于 2016-09-23 20:31
先找最右的01,将其变成10,后面的所有1全部移到最右,第二题我是这么写的,AC了。
点赞 回复 分享
发布于 2016-09-23 20:28
感觉都是直接遍历都能解出来。 字符串那个两层遍历,第一层是下标从0到最后,第二层是字符串长度从1到size / 2; 然后比较字串的子串是否相等,把相等的字串放到set中。最后打印set的size就行了 string str; unordered_set<string> strSet; cin >> str; for(int pos = 0; pos < str.size(); ++pos) for(int len = 1; len <= str.size() / 2; ++len) { if(str.substr(pos, len) == str.substr(pos + len, len)) { strSet.insert(str.substr(pos, len)); } } cout << strSet.size() << endl;
点赞 回复 分享
发布于 2016-09-23 21:38
第二题A还可能大于B啊T。T,给跪啊
点赞 回复 分享
发布于 2016-09-23 20:34
import java.util.Scanner; publicclass Main {     public static void main(String[] args) {         Scanner in = new Scanner(System.in);         while (in.hasNextInt()) {             int n = in.nextInt();             String bin = Integer.toBinaryString(n);             char[] c = bin.toCharArray(); //10进制转为2进制             int first1 = -1;             int first0 = -1;             for(int i=c.length-1,len=c.length;i>=0;i--){             if(c[i]=='1'&&first1==-1){             first1 = i; //找到从右往左的第一个1             }             if(c[i]=='0'&&first1!=-1){             first0 = i; //从第一个1开始出发,找到第一个0             break;             }             }             c[first1] = '0'; //1变0             c[first0] = '1'; //0变1             System.out.println(Integer.parseInt(String.valueOf(c),2));  //2进制转回10进制         }     } }
点赞 回复 分享
发布于 2016-09-23 20:14
一开始用最笨的方法,求出输入的数有多少个1然后从那个数开始自加,求出同样多1的最近的那个数,结果通过百分之80.。。
点赞 回复 分享
发布于 2016-09-23 20:10

相关推荐

这是我最不理解的一次,有史以来发挥的最好的一次面试,什么问题都答了,tmd做完手撕自我感觉良好,周一一看一面挂,我是百度一生黑先说一下手撕,第一题是计算一个数组最大的连续非递减序列的长度&nbsp;第二题是手撕Array.prototype.myreduce()1.自我介绍2.为什么学前端3.学习前端两个月的心得4.如果去做一个需求,但是从来没有学习过这个需求涉及的知识框架,你应该怎么入手5.如果是要让你去对一个技术框架或者技术做一个选型,你认为你会通过哪些方面去对比这些框架6.解释了一下上题答案(上手难度、性能、维护难度、社区成熟度、包体积),你认为这五点中最重要的两点是什么答的社区成熟度和维护难度,面试官稍微有些反馈,不知道有没有标准答案7.让你去对比两个框架或者是两种写法的性能,你会用什么方式去做它?8.项目是怎么做的,是跟着导师还是实习9.你是怎么学习的VUE10.介绍一下这个互动式论坛,这里边的路由守卫通过&nbsp;token&nbsp;来实现页面鉴权这个东西你是怎么做的被问了好多次这个问题,总结一下:
客户端使用用户名跟密码请求登录服务端收到请求,去验证用户名与密码验证成功后,服务端会签发一个&nbsp;Token,再把这个&nbsp;Token&nbsp;发送给客户端客户端收到&nbsp;Token&nbsp;以后可以把它存储起来,比如放在&nbsp;Cookie&nbsp;里或者&nbsp;Local&nbsp;Storage&nbsp;里客户端每次向服务端请求资源的时候需要带着服务端签发的&nbsp;Token服务端收到请求,然后去验证客户端请求里面带着的&nbsp;Token,如果验证成功,就向客户端返回请求的数据在我们做用户权限认证的时候,每次请求都会将Token放在请求头中一起发送到服务器端,服务器端通过拦截器进行拦截校验,如果不存在Token、Token错误或者Token过期,则拒绝请求,有效则返回相应的返回结果。Token会失效,Token的有效期一般是由后端设置的,比方说在后端签发Token时给Token设置一个有效期,在字段里面写一个exp代表过期时间,后端在验证&nbsp;JWT&nbsp;时,会检查当前时间是否超过&nbsp;exp,如果超了,就返回&nbsp;401&nbsp;Unauthorized。如果Token失效的话,那么对于关键资源的请求就会被服务器拒绝,所以这就实现了一个用户鉴权的效果。11.追问:Token会过期吗12.追问:Token过期了怎么处理?13.JS怎么实现面向对象的?14.手撕算法
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务