最大单词长度乘积
class Solution {
public:
int maxProduct(vector<string>& words) {
int ans=0;
int n=words.size();
//将每个字符串转换为二进制
vector<int>word;
for(string w:words){
unordered_set<char>set;
for(char ch:w){
set.insert(ch);
}
int binary=0;
for(int i=0;i<26;++i){
int x=set.find('a'+i)!=set.end()?1:0;
binary=(binary<<1)|x;
}
word.push_back(binary);
}
for(int i=0;i<n;++i){
for(int j=i+1;j<n;++j){
if((word[i]&word[j])==0){//优化比较两个字符串
ans=ans>words[i].length()*words[j].length()?ans:words[i].length()*words[j].length();
}
}
}
return ans;
}
};
整数转换
解题思路:
C++ 竟然没有逻辑移位符,要想实现逻辑移位,必须先将数字转换位 unsigned int类型,然后进行>> 或者 << 。
class Solution {
public:
int convertInteger(int A, int B) {
int ans=0;
while(A!=0||B!=0){
if((A&1)!=(B&1)){
ans++;
}
A=(unsigned)A>>1;
B=(unsigned)B>>1;
}
return ans;
}
};
插入
class Solution {
public:
int insertBits(int N, int M, int i, int j) {
M<<=i;//M左移i位进行对齐
int ans=0;
for(int k=0;k<32;++k){
int c=(k>=i&&k<=j)?(M&(1<<k)):(N&(1<<k));//结果第k位上的数字
ans|=c;
}
return ans;
}
};
不用加减乘除做加法
解题思路:
class Solution {
public:
int add(int a, int b) {
while(b!=0){
int c=(unsigned)(a&b)<<1; //leetcod c++不支持负值左移,需要强制转换为无符号数
a^=b;
b=c;
}
return a;
}
};
数字的补数
class Solution {
public:
int findComplement(int num) {
int tmp=num;
int XOR=0;
while(tmp>0){
XOR=(XOR<<1)+1;
tmp>>=1;
}
return num^XOR;
}
};
数字转换为十六进制数
解题思路:
使用位运算,每次右移4位,对应1位16进制数字。
使用
0
x
f
(
00...01111
b
)
0xf(00...01111b)
0xf(00...01111b) 获取
n
u
m
num
num 的低4位。
注意:
要去掉高位的0
class Solution {
public:
string toHex(int num) {
if(num==0)return "0";
string t="0123456789abcdef";
string ans;
for(int i=0;i<8;++i){
ans+=t[num&0xf];
num>>=4;
}
reverse(ans.begin(),ans.end());
int i=0;
while(i<32){
if(ans[i]=='0'){
i++;
}else{
return ans.substr(i);
}
}
return ans;
}
};
位运算返回32位整数a和b中较大的
class Solution {
public int flip(int x){// 1-->0 0-->1
return x^1;
}
public int sign(int x){//负数-->0 0/正数-->1
return flip((x>>31)&1); //&1 是保证溢出后依然正确
}
public int maximum(int a, int b) {
int c=a-b;
int signA=sign(a);
int signB=sign(b);
int signc=sign(c);
int different=signA^signB;// a,b符号一样-->0 不一样-->1
int same=flip(different);
int returnA=different*signA+same*signc;
int returnB=flip(returnA);
return a*returnA+b*returnB;
}
}
是不是2的幂
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param number int整型
* @return bool布尔型
*/
public boolean is2Power (int number) {
// write code here
int mostRightOne=number&(~number+1);
return number==mostRightOne;
}
}
是不是4的幂
class Solution {
public boolean isPowerOfTwo (int n) {
// write code here
int mostRightOne=n&(~n+1);
return n==mostRightOne;
}
public boolean isPowerOfFour(int n) {
if(n==0)return false;
return isPowerOfTwo(n)&&(n& 0xaaaaaaaa)==0;
}
}
二进制数含0个数
#include <iostream>
#include<stdio.h>
using namespace std;
int counts(int x) {//返回x的位数 11001:5位
if(x==1||x==0)return 1;
for (int i = 0;; ++i) {
if ((1 << i) < x && (1 << (i + 1) )>= x)return i + 1;
}
}
int countZero(int x) {
int tmp=x;
int ans=0;
while(tmp!=0){
if(tmp%2==0)ans++;
tmp=(tmp>>1);
}
return ans;
}
int main() {
int N;
cin >> N;
int ans=0;
for(int i=1;i<=N;++i){
ans+=countZero(i);
}
cout<<ans;
}